我有以下数据和代码来圆这个数据表的选定列:
mydf = structure(list(vnum1 = c(0.590165705411504, -1.39939534199836,
0.720226053660755, -0.253198380120377, -0.783366825121657), vnum2 = c(0.706508400384337,
0.526770398486406, 0.863136084517464, 0.838245498016477, 0.556775856064633
), vch1 = structure(c(2L, 4L, 1L, 3L, 3L), .Label = c("A", "B",
"C", "E"), class = "factor")), .Names = c("vnum1", "vnum2", "vch1"
), row.names = c(NA, -5L), class = c("data.table", "data.frame"
))
mydf[,round(.SD,1),]
数学 Dataframe (列表(vnum1 = c(0.590165705411504,-1.39939534199836,:数据框中的非数值变量:视频通道1
一个二个一个一个
是否有代码更短的方法?
9条答案
按热度按时间dhxwm5r41#
使用
dplyr
如果要一次舍入多列:
或者,如果要更改除"vch1"以外的所有列:
或者,如果要更改所有以"vnum"开头的列:
或者,如果只想更改数值列:
您将获得:
htzpubme2#
如果您不介意覆盖原来的
mydf
:cdmah0mi3#
dplyr
可以在data.table
对象上工作!dplyr::mutate
(从dplyr 1.0.0主要更新开始)包含了灵活的列规范和函数,用于使用across
修改数据。要指定包含数值数据的所有列:
mydf %>% mutate(across(where(is.numeric), ~round(., 1)))
要指定名称以“vnum”开头的所有列:
mydf %>% mutate(across(starts_with("vnum"), ~round(., 1)))
它比以前的
mutate_if
(仍然有效,但已退役)稍微冗长一些,但它与其他可能的规范一致,并允许更多的变化。旧答案
使用
mutate_if
的另一个好处是,仅当列为数值时才对其进行舍入mydf %>% mutate_if(is.numeric, round, 1)
rnmwe5a24#
从
dplyr
0.8.0开始,funs()
是soft deprecated。这意味着应该使用list(name = ~f(.))
而不是funs(name = f(.))
:或者写成一个简单的lambda函数:
然后,从
dplyr 1.0.0
开始,使用mutate()
内部的across()
:与select helper一起使用,此处选择以“vnum”开头的变量:
或仅选择数值变量:
iezvtpos5#
简短澄清的溶液:
相同,但具有描述性详细信息:
如果我有许多列,请说:(vnum1,vnum2,vch1,vch2,vbin1,vbin2,vbin3),而我只想取整vnum1和vnum2?
在这种情况下,您可以使用
:=
运算符和.SDcols =
参数来指定要舍入的列:如果您需要舍入某些列并从输出中排除其他列,您可以只使用
.SDcols =
参数同时执行这两项操作:.SDcols =
可以提供列名或其编号,作为名称为
.SDcols = "vnum1"
或编号为.SDcols = 1
的单列作为名称为
.SDcols = c("vnum2", "vnum1")
或编号为.SDcols = c(2, 1)
的多列作为名称为
.SDcols = vnum1:vnum2
或编号为.SDcols = 1:2
的列范围wqlqzqxt6#
如果希望能够返回副本,可以使用函数
职能部门:
用法
要返回表的副本而不修改原始表:
并在位修改对象:
return_copy=
设置为FALSE
,则不必将auto_round_dt
的结果分配给新的data.table
。ujv3wf0j7#
目前最短:
有趣的方法。但是如果我有很多列,比如:(vnum1,vnum2,vch1,vch2,vbin1,vbin2,vbin3),而我只想舍入vnum1和vnum2?另外,解释一下它是如何工作的也会很有用
它使用data.table的"by ="按舍入列进行分组。
下面的例子是基于这个方法来解决你的第二级任务。
内置数据集:
短溶液:
初始列顺序:
k3bvogb18#
我认为从解决方案来看,Steven Baupre使用
dplyr
的解决方案是最优雅的,并且可以选择性地应用于 Dataframe 中的不同列,特别是在计算物理中。如您所见,压力和温度将四舍五入到0位小数;假减压和温度至2德克斯;最后,伪临界压力和温度精确到小数点后1位。
nue99wik9#
如果你想要/需要避免特定的data.table约定,你可以在base R中通过转换成一个普通的data.frame来实现(或者如果你从data.frame开始,那么跳过转换步骤)
要转换的列名向量
rCols <- c('vnum1', 'vnum2')
转换为常规数据.frame
mydf1 <- as.data.frame(mydf)
仅覆盖要舍入的特定列
mydf1[, rCols] <- apply(mydf1[, rCols], 2, function(x) round(x, 1))