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