如果将列转换为以逗号分隔的列表1

时间:2019-10-23 17:28:49

标签: r dplyr

我正在尝试将某些包含1或0的列转换为带有列名称的逗号分隔列表。

更具体地举例说明:

df <- data.frame(id = c(1, 2, 3, 4), A = c("0", "1", "1", "0"), B = c("1", "1", "0", "0"), C = c("0", "0", "1", "1"))

如果列A,B和C等于1,则应创建一个新的“列表”列,其中包含所有用逗号分隔的“标记”(列名)。

id  A   B   C
1   0   1   0
2   1   1   0
3   1   0   1
4   0   0   1

所需结果:

id  A   B   C   list
1   0   1   0   B
2   1   1   0   A, B
3   1   0   1   A, C
4   0   0   1   C

3 个答案:

答案 0 :(得分:6)

这是applybase R的一个选项

df$new <- apply(df[-1], 1, function(x) toString(names(x)[x==1]))

在这里,我们正在创建一个字符串列,但是如果要创建一个list

df$new <- apply(df[-1], 1, function(x) names(x)[x==1])

答案 1 :(得分:4)

由于问题是用dplyr标记的,因此以下是使用该问题和tidyr的解决方案:

library(dplyr)
library(tidyr)
df1 %>% 
  gather(col, val, A:C) %>% 
  group_by(id) %>% 
  filter(val==1) %>% 
  select(-val) %>% 
  nest(list = col) %>% 
  right_join(df1, .) %>% 
  arrange(id)
#>   id A B C list
#> 1  1 0 1 0    B
#> 2  2 1 1 0 A, B
#> 3  3 1 0 1 A, C
#> 4  4 0 0 1    C

更新:

如果您希望该列为character的类,则可以进行以下工作:

df1 %>% 
  gather(col, val, A:C) %>% 
  group_by(id) %>% 
  filter(val==1) %>% 
  select(-val) %>% 
  summarise_each(list(~paste(., collapse = ", "))) %>% 
  right_join(df1, .) %>% 
  as_tibble()
#>      id A     B     C     col  
#>   <dbl> <fct> <fct> <fct> <chr>
#> 1     1 0     1     0     B    
#> 2     2 1     1     0     A, B 
#> 3     3 1     0     1     A, C 
#> 4     4 0     0     1     C

答案 2 :(得分:2)

以下是使用基R的基于循环的简单解决方案



df[1,]<-c(0,1,0)
df[2,]<-c(1,1,0)
df[3,]<-c(1,0,1)
df[4,]<-c(0,0,1)

for (i in 1:ncol(df)){
  x1<-which(df[i,]==1)
  y<-colnames(df)
  print(y[x1])
}
#output
[1] "B"
[1] "A" "B"
[1] "A" "C"
[1] "C"