我在this帖子中发现了如何替换数据框的所有列中数字的出现次数(例如,将所有4替换为10)在所有列中):DF[DF == 4] <- 10
。使用数据表,可以以完全相同的方式实现相同的结果:DT[DT == 4] <- 10
。
但是,如果我想应用此修改但仅应用于数据表中的特定列,无论这些列是按位置指定(例如2:4
)还是通过姓名(例如c("V2", "V3", "V4")
)?
我倾向于采用“优雅”的解决方案而不是每列的迭代。
答案 0 :(得分:3)
我们可以使用效率更高的set
for(j in 2:4) {
set(DT, i = which(DT[[j]]==4), j=j, value = 10)
}
DT
# V1 V2 V3 V4
#1: A 2 2 10
#2: B 1 10 10
#3: C 3 10 3
#4: D 3 2 10
#5: E 3 3 3
#6: F 10 3 3
以上也可以使用列名来完成
for(j in names(DT)[2:4]){
set(DT, i = which(DT[[j]]==4), j=j, value = 10)
}
或者另一种选择是使用感兴趣的列(数字索引或列名称)指定.SDcols
,循环遍历Data.table的子集(.SD
),{{1将值4到10并将输出(replace
)分配回感兴趣的列
:=
或使用列名
DT[, (2:4) := lapply(.SD, function(x) replace(x, x==4, 10)), .SDcols = 2:4]
DT[, (names(DT)[2:4]) := lapply(.SD, function(x) replace(x, x==4, 10)),
.SDcols = names(DT)[2:4]]