使用列名(R)更改数据表中的单元格值?

我有一个包含 0 和 1 单元格的数据表。我想用列名更改列中的每个“1”,用 NA 更改每个“0”。

set.seed(45)
DT = data.table(
  names = c("n1", "n2", "n3", "n4", "n5"),
  a = sample(c(0, 1), size = 5, replace = TRUE),
  b = sample(c(0, 1), size = 5, replace = TRUE),
  c = sample(c(0, 1), size = 5, replace = TRUE))

我从什么开始:

   names a b c
1:    n1 0 1 1
2:    n2 0 0 0
3:    n3 1 0 0
4:    n4 1 1 1
5:    n5 0 0 1

我想要的是:

   names  a  b  c
1:    n1 NA  b  c
2:    n2 NA NA NA
3:    n3  a NA NA
4:    n4  a  b  c
5:    n5 NA NA  c

如果尝试更改每列的此项,请在此处更改第 2 列。我将所有 0 更改为 NA - 并且 1 保持不变。我尝试更改 1s ,DT[x, 2] <- colnames(DT)[2]但它不起作用。它被注释掉了,因为如果我用 1 和 0 都变成 NA 来运行它。

for (x in c(1:nrow(DT))) {
  test <- as.integer(DT[x, 2])
  if (test == 1) {
    #DT[x, 2] <- colnames(DT)[2]
  }
  else {
    DT[x, 2] <- NA
  }
}

此外,如果我尝试使用变量设置列号,以便更轻松地对所有列执行此操作。它调用一个错误。

col <- 2
for (x in c(1:nrow(DT))) {
  test <- as.integer(DT[x, col])
  if (test == 1) {
    #DT[x, 2] <- colnames(DT)[col]
  }
  else {
    DT[x, col] <- NA
  }
}

如果我尝试使用 for 循环遍历列和行,则相同。


for (c in c(2:4)) {
 for (r in c(1:nrow(DT))) {
   test <- as.integer(DT[r, c])
   if (test == 1) {
     print("yes")
     #DT[r, c] <- colnames(DT)[c]
   }
   else {
     DT[r, c] <- NA
   }
 }
}

有人可以帮我识别错误吗?或者是否有一些包可以为我做这个?

回答

一个快速的解决方案:

cols <- c('a', 'b', 'c')
for (cl in cols) {
  set(DT, j = cl, value = fifelse(DT[[cl]]==0, NA_character_, cl))
}

还有一种替代解决方案Map()

DT[, (cols) := Map(function(x, y) fifelse(x==0, y, NA_character_), .SD, cols), .SDcols = cols]


以上是使用列名(R)更改数据表中的单元格值?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>