R 创建一列,指示一组列中是否存在值

R 创建一列,指示一组列中是否存在值,r,data.table,R,Data.table,我有一张这样的桌子: table1 <- data.table(ID = 1:10, col1 = c("x1", "x2", "x3", NA, NA, NA, "x7", "x8", "x9", "x10"), col2 = c("x1", &q

我有一张这样的桌子:

table1 <- data.table(ID = 1:10,
                     col1 = c("x1", "x2", "x3", NA, NA, NA, "x7", "x8", "x9", "x10"),
                     col2 = c("x1", "x2", "x3", "x4", NA, NA, "x7", NA, "x9", "x10"),
                     col3 = c("x1", NA, NA, "x4", "x5", "x6", NA, "x8", NA, "x10"))

    ID col1 col2 col3
 1:  1   x1   x1   x1
 2:  2   x2   x2 <NA>
 3:  3   x3   x3 <NA>
 4:  4 <NA>   x4   x4
 5:  5 <NA> <NA>   x5
 6:  6 <NA> <NA>   x6
 7:  7   x7   x7 <NA>
 8:  8   x8 <NA>   x8
 9:  9   x9   x9 <NA>
10: 10  x10  x10  x10

features
列反映了
表1
中对应的
ID
的组合。如何操作?

base R
中,可以使用
apply()

输出:

table1
    ID col1 col2 col3            Var
 1:  1   x1   x1   x1 col1:col2:col3
 2:  2   x2   x2 <NA>      col1:col2
 3:  3   x3   x3 <NA>      col1:col2
 4:  4 <NA>   x4   x4      col2:col3
 5:  5 <NA> <NA>   x5           col3
 6:  6 <NA> <NA>   x6           col3
 7:  7   x7   x7 <NA>      col1:col2
 8:  8   x8 <NA>   x8      col1:col3
 9:  9   x9   x9 <NA>      col1:col2
10: 10  x10  x10  x10 col1:col2:col3
# A tibble: 10 x 2
      ID val           
   <int> <chr>         
 1     1 col1:col2:col3
 2     2 col1:col2     
 3     3 col1:col2     
 4     4 col2:col3     
 5     5 col3          
 6     6 col3          
 7     7 col1:col2     
 8     8 col1:col3     
 9     9 col1:col2     
10    10 col1:col2:col3
#一个tible:10x2
ID val
1第1列:第2列:第3列
2 col1:col2
3 col1:col2
第4列第2列:第3列
5列3
6 col3
7 col1:col2
8 col1:col3
9 col1:col2
10第1列:第2列:第3列

base R
中,可以使用
apply()

输出:

table1
    ID col1 col2 col3            Var
 1:  1   x1   x1   x1 col1:col2:col3
 2:  2   x2   x2 <NA>      col1:col2
 3:  3   x3   x3 <NA>      col1:col2
 4:  4 <NA>   x4   x4      col2:col3
 5:  5 <NA> <NA>   x5           col3
 6:  6 <NA> <NA>   x6           col3
 7:  7   x7   x7 <NA>      col1:col2
 8:  8   x8 <NA>   x8      col1:col3
 9:  9   x9   x9 <NA>      col1:col2
10: 10  x10  x10  x10 col1:col2:col3
# A tibble: 10 x 2
      ID val           
   <int> <chr>         
 1     1 col1:col2:col3
 2     2 col1:col2     
 3     3 col1:col2     
 4     4 col2:col3     
 5     5 col3          
 6     6 col3          
 7     7 col1:col2     
 8     8 col1:col3     
 9     9 col1:col2     
10    10 col1:col2:col3
#一个tible:10x2
ID val
1第1列:第2列:第3列
2 col1:col2
3 col1:col2
第4列第2列:第3列
5列3
6 col3
7 col1:col2
8 col1:col3
9 col1:col2
10第1列:第2列:第3列

由于您使用的是
数据表
,您可以执行以下操作:

table1[, .(features = paste(names(table1)[-1][!is.na(.SD)], collapse = ":")), 
    ID]
##     ID       features
##  1:  1 col1:col2:col3
##  2:  2      col1:col2
##  3:  3      col1:col2
##  4:  4      col2:col3
##  5:  5           col3
##  6:  6           col3
##  7:  7      col1:col2
##  8:  8      col1:col3
##  9:  9      col1:col2
## 10: 10 col1:col2:col3
或者您可以
熔化
数据,然后使用
粘贴
进行聚合:

melt(table1, "ID", na.rm = TRUE)[, .(features = paste(variable, collapse = ":")), ID]

由于您使用的是
data.table
,因此可以执行以下操作:

table1[, .(features = paste(names(table1)[-1][!is.na(.SD)], collapse = ":")), 
    ID]
##     ID       features
##  1:  1 col1:col2:col3
##  2:  2      col1:col2
##  3:  3      col1:col2
##  4:  4      col2:col3
##  5:  5           col3
##  6:  6           col3
##  7:  7      col1:col2
##  8:  8      col1:col3
##  9:  9      col1:col2
## 10: 10 col1:col2:col3
或者您可以
熔化
数据,然后使用
粘贴
进行聚合:

melt(table1, "ID", na.rm = TRUE)[, .(features = paste(variable, collapse = ":")), ID]