使用R将数据集中的多列合并为一列

普里亚

我有以下数据框:

dF
    x     y     z     w
  <lgl> <lgl> <lgl> <lgl>
1  TRUE FALSE  TRUE FALSE
2  TRUE FALSE  TRUE FALSE
3  TRUE FALSE  TRUE FALSE

我想创建一个新列,该列为每一行存储等于TRUE的列,因此例如第1行将为c(x,z)(例如,字符格式)。

在R中想得到以下输出

x     y     z     w          new
 
TRUE FALSE  TRUE FALSE     x,z
TRUE TRUE  TRUE FALSE      X,Y,Z
FALSE FALSE  TRUE TRUE      Z,W

我已经尝试过从堆栈溢出的代码之一,但是我得到列表形式的结果,即:c(x,z)但我想要x,z请对此进行指导。谢谢。

阿克伦

我们可以使用适用于遍历行(MARGIN = 1),paste所述names元件(toString=>paste(..., collapse=", ")子集根据逻辑矢量之后)

df1$new <- apply(df1, 1, FUN = function(x) toString(names(x)[x]))
df1
#      x     y    z     w     new
#1  TRUE FALSE TRUE FALSE    x, z
#2  TRUE  TRUE TRUE FALSE x, y, z
#3 FALSE FALSE TRUE  TRUE    z, w

或使用tidyverse,我们可以将其整形为“长”格式(pivot_longer)并按)进行分组row_number()paste

library(dplyr)
library(tidyr)
df1 %>%
     mutate(rn = row_number()) %>%
     pivot_longer(cols = -rn) %>%
     group_by(rn) %>% 
     summarise(new = toString(name[value])) %>% 
     select(-rn) %>%
     bind_cols(df1, .)

或另一个选择是 c_across

df1 %>%
    rowwise %>% 
    mutate(new = toString(names(.)[c_across(everything())]))
# A tibble: 3 x 5
# Rowwise: 
#  x     y     z     w     new    
#  <lgl> <lgl> <lgl> <lgl> <chr>  
#1 TRUE  FALSE TRUE  FALSE x, z   
#2 TRUE  TRUE  TRUE  FALSE x, y, z
#3 FALSE FALSE TRUE  TRUE  z, w   

数据

df1 <- structure(list(x = c(TRUE, TRUE, FALSE), y = c(FALSE, TRUE, FALSE
), z = c(TRUE, TRUE, TRUE), w = c(FALSE, FALSE, TRUE)),
class = "data.frame", row.names = c("1", 
"2", "3"))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章