将标志列合并为R中的单个列

时间:2017-11-07 20:16:07

标签: r

假设我有一个像这样的数据框

testtbl <- data.frame(ID = c('1','2','3','4'),
                      A = c(1,0,1,1),
                      B = c(1,1,1,1),
                      C = c(0,0,0,1),
                      D = c(0,1,1,1))

> testtbl
  ID A B C D
1  1 1 1 0 0
2  2 0 1 0 1
3  3 1 1 0 1
4  4 1 1 1 1

A - D是可以是1或0的标志。我想将这些列合并为1列,其中新数据框看起来像这样:

> testtbl
  ID flag
1  1 A,B
2  2 B,D
3  3 A,B,D
4  4 A,B,C,D

对我如何接近这一点感到困惑,并希望得到任何提示或帮助。

3 个答案:

答案 0 :(得分:3)

您也可以在没有任何带适用的库的情况下执行此操作:

testtbl <- data.frame(ID = c('1','2','3','4'),
                  A = c(1,0,1,1),
                  B = c(1,1,1,1),
                  C = c(0,0,0,1),
                  D = c(0,1,1,1))
test<-data.frame(ID=testtbl$ID, flag=(apply(testtbl[,-1], 1, function(x) paste0(names(x)[which(x==1)], collapse=','))))

答案 1 :(得分:2)

来自dplyrtidyr的解决方案。

library(dplyr)
library(tidyr)
testtbl2 <- testtbl %>%
  gather(Col, Val, -ID) %>%
  filter(Val == 1) %>%
  select(-Val) %>%
  group_by(ID) %>%
  summarise(flag = toString(Col))
testtbl2
# # A tibble: 4 x 2
#       ID       flag
#   <fctr>      <chr>
# 1      1       A, B
# 2      2       B, D
# 3      3    A, B, D
# 4      4 A, B, C, D

答案 2 :(得分:1)

基础R

do.call(rbind, lapply(split(testtbl, testtbl$ID), function(x)
    data.frame(ID = x[1],
               flag = paste(sort(names(x)[-1][x[-1] > 0]),
                            collapse = ","))))
#  ID    flag
#1  1     A,B
#2  2     B,D
#3  3   A,B,D
#4  4 A,B,C,D