我正在尝试将某些包含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
答案 0 :(得分:6)
这是apply
中base 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"