如何在R中包含一些字符变量的data.frame?

KT_*_*T_1 29 r

我有一个数据帧,我希望舍入所有数字(准备导出).这必须是直截了当的,但我遇到了问题,因为数据帧的某些位不是数字.例如,我想在下面的例子中将数字四舍五入到最接近的整数:

ID = c("a","b","c","d","e")
Value1 = c("3.4","6.4","8.7","1.1","0.1")
Value2 = c("8.2","1.7","6.4","1.9","10.3")
df<-data.frame(ID,Value1,Value2)
Run Code Online (Sandbox Code Playgroud)

谁能帮我吗?我可以围绕单个列(例如round(df$Value1, 2)),但我想围绕一个包含一些非数字列的整个表.

akh*_*med 45

认识到这是一个老问题并且接受了一个答案,我想提供另一种解决方案,因为该问题在Google上显示为排名靠前的结果.

更通用的解决方案是创建一个单独的函数,搜索所有数值变量并将它们舍入到指定的位数:

round_df <- function(df, digits) {
  nums <- vapply(df, is.numeric, FUN.VALUE = logical(1))

  df[,nums] <- round(df[,nums], digits = digits)

  (df)
}
Run Code Online (Sandbox Code Playgroud)

定义后,您可以按如下方式使用它:

> round_df(df, digits=3)
Run Code Online (Sandbox Code Playgroud)

  • 我从未想到过的出色而简单的解决方案!谢谢! (2认同)

use*_*199 32

我认为现在最好的方法是使用 dplyr

library(dplyr)
df %>% 
 mutate_if(is.numeric, round)
Run Code Online (Sandbox Code Playgroud)

这将舍入数据框中的所有数字列

  • `mutate_if` 已被 `cross` 取代!现在使用 `library(dplyr); df %&gt;% 变异(跨(is.numeric,round,digits=3))` (12认同)
  • 辉煌!`库(dplyr); df%>%mutate_if(is.numeric,round,digits = 3)` (9认同)
  • `df %&gt;% mutate(across(where(is.numeric), round,digits=3))` (4认同)

Pie*_*nte 29

首先确保您的数字列是数字:

ID = c("a","b","c","d","e")
Value1 = as.numeric(c("3.4","6.4","8.7","1.1","0.1"))
Value2 = as.numeric(c("8.2","1.7","6.4","1.9","10.3"))
df<-data.frame(ID,Value1,Value2, stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)

然后,仅舍入数字列:

df[,-1] <-round(df[,-1],0) #the "-1" excludes column 1
df

  ID Value1 Value2
1  a      3      8
2  b      6      2
3  c      9      6
4  d      1      2
5  e      0     10
Run Code Online (Sandbox Code Playgroud)


Alv*_*vis 16

我知道这是一个迟到的回复,但我也有同样的问题.经过一番搜索后,我发现这是最优雅的解决方案:

data.frame(lapply(x, function(y) if(is.numeric(y)) round(y, 2) else y)) 
Run Code Online (Sandbox Code Playgroud)

解决方案来自:Jean V. Adams统计学家美国地质调查局大湖科学中心223 East Steinfest Road Antigo,WI 54409 USA

http://r.789695.n4.nabble.com/round-a-data-frame-containing-character-variables-td3732415.html


小智 8

这是我喜欢使用的单行:(这将仅将round函数应用于classes参数中指定的类类型的列)

df2 <- rapply(object = df, f = round, classes = "numeric", how = "replace", digits = 0) 
Run Code Online (Sandbox Code Playgroud)