我已经遇到这个职位上如何更换一批出现在所有的一列数据帧(例如,在所有列替换所有4×10) DF[DF == 4] <- 10。使用数据表可以以完全相同的方式获得相同的结果:DT[DT == 4] <- 10.
但是,如果我想应用此修改但仅应用于数据表中的特定列,我应该如何处理这些列是按位置(例如2:4)还是按名称(例如c("V2", "V3", "V4"))指定的?
我更喜欢“优雅”的解决方案,而不是对每一列进行迭代。
我们可以使用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
Run Code Online (Sandbox Code Playgroud)
以上也可以用列名来完成
for(j in names(DT)[2:4]){
set(DT, i = which(DT[[j]]==4), j=j, value = 10)
}
Run Code Online (Sandbox Code Playgroud)
或者另一种选择是指定.SDcols感兴趣的列(数字索引或列名),循环遍历 Data.table ( .SD)的子集,replace4 到 10 的值并将 ( :=) 输出分配回列出于兴趣
DT[, (2:4) := lapply(.SD, function(x) replace(x, x==4, 10)), .SDcols = 2:4]
Run Code Online (Sandbox Code Playgroud)
或列名
DT[, (names(DT)[2:4]) := lapply(.SD, function(x) replace(x, x==4, 10)),
.SDcols = names(DT)[2:4]]
Run Code Online (Sandbox Code Playgroud)
set.seed(24)
DT <- data.table(V1 = LETTERS[1:6], V2 = sample(1:4, 6, replace = TRUE),
V3 = sample(2:4, 6, replace = TRUE), V4 = sample(3:4, 6, replace= TRUE))
Run Code Online (Sandbox Code Playgroud)