我有一个数据帧,我希望舍入所有数字(准备导出).这必须是直截了当的,但我遇到了问题,因为数据帧的某些位不是数字.例如,我想在下面的例子中将数字四舍五入到最接近的整数:
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)
use*_*199 32
我认为现在最好的方法是使用 dplyr
library(dplyr)
df %>%
mutate_if(is.numeric, round)
Run Code Online (Sandbox Code Playgroud)
这将舍入数据框中的所有数字列
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)
归档时间: |
|
查看次数: |
53014 次 |
最近记录: |