替换数据表中特定列中出现的数字

mat*_*mat 5 r data.table

我已经遇到这个职位上如何更换一批出现在所有的一列数据帧(例如,在所有列替换所有4×10) DF[DF == 4] <- 10。使用数据表可以以完全相同的方式获得相同的结果:DT[DT == 4] <- 10.

但是,如果我想应用此修改但仅应用于数据表中的特定列,我应该如何处理这些列是按位置(例如2:4)还是按名称(例如c("V2", "V3", "V4"))指定的?

我更喜欢“优雅”的解决方案,而不是对每一列进行迭代。

akr*_*run 5

我们可以使用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)

  • 这工作得很好!我只是建议您再添加一行代码,但使用列名让每个人都清楚。 (2认同)