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

使用列名(R)更改数据表中的单元格值?,r,data.table,R,Data.table,我有一个数据表,单元格包含0和1。我想用列名更改列中的每个“1”,用NA更改每个“0” 我从以下几点开始: 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

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

我从以下几点开始:

   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列。 我用NAs更改所有0,1保留1。 我试着用
DT[x,2]改变1s,这里有一个选项

DT[, lapply(replace(.SD * col(.SD), !.SD, NA), function(v) names(.SD)[v]), names]

   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
命名为a b c
1:n1 b c
2:n2
3:n3 a
4:n4 a b c
5:n5 c

这里有一个
tidyverse/purrr
选项:

map2_df(DT, names(DT), ~  replace(.x, .x==1, .y) %>% replace(. == 0, NA))

# A tibble: 5 x 4
  names a     b     c    
  <chr> <chr> <chr> <chr>
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   
map2_df(DT,名称(DT),~replace(.x,.x==1.y)%>%replace(.==0,NA))
#一个tibble:5x4
名称a b c
1 n1钠硼碳
2 n2 NA NA
3 n3 a NA NA
4 n4 a b c
5N5Na-c
快速解决方案:

cols <- c('a', 'b', 'c')
for (cl in cols) {
  set(DT, j = cl, value = fifelse(DT[[cl]]==0, NA_character_, cl))
}
DT[, lapply(replace(.SD * col(.SD), !.SD, NA), function(v) names(.SD)[v]), names]
   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
map2_df(DT, names(DT), ~  replace(.x, .x==1, .y) %>% replace(. == 0, NA))

# A tibble: 5 x 4
  names a     b     c    
  <chr> <chr> <chr> <chr>
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   
cols <- c('a', 'b', 'c')
for (cl in cols) {
  set(DT, j = cl, value = fifelse(DT[[cl]]==0, NA_character_, cl))
}
DT[, (cols) := Map(function(x, y) fifelse(x==0, y, NA_character_), .SD, cols), .SDcols = cols]