根据行值连接列名

Rin*_*haj 3 r dataframe

我有一个包含 3 列的 R 数据框,其中包含值 0 或 1。当值是 1 时,我需要创建一个列作为列名的串联,用“&”分隔。以下代码使用空格 '' 作为分隔符,但当我将其更改为 '&' 时失败。

代码:

A = c(1,0,1,0,0,1)
B = c(1,1,1,0,1,0)
C = c(0,0,0,1,1,1)
data = data.frame(A, B, C)
data$New = paste(ifelse(data$A == 1, "A", ""),
                 ifelse(data$B == 1, "B", ""),
                 ifelse(data$C == 1, "C", ""), sep = '')
data
Run Code Online (Sandbox Code Playgroud)

输出:

  A B C New
1 1 1 0  AB
2 0 1 0   B
3 1 1 0  AB
4 0 0 1   C
5 0 1 1  BC
6 1 0 1  AC
Run Code Online (Sandbox Code Playgroud)

带有“&”分隔符的代码和输出:

A = c(1,0,1,0,0,1)
B = c(1,1,1,0,1,0)
C = c(0,0,0,1,1,1)
data = data.frame(A, B, C)
data$New = paste(ifelse(data$A == 1, "A", ""), 
                 ifelse(data$B == 1, "B", ""),
                 ifelse(data$C == 1, "C", ""), sep = '&')
data

  A B C  New
1 1 1 0 A&B&
2 0 1 0  &B&
3 1 1 0 A&B&
4 0 0 1  &&C
5 0 1 1 &B&C
6 1 0 1 A&&C
Run Code Online (Sandbox Code Playgroud)

预期输出:

  A B C New
1 1 1 0 A&B
2 0 1 0   B
3 1 1 0 A&B
4 0 0 1   C
5 0 1 1 B&C
6 1 0 1 A&C
Run Code Online (Sandbox Code Playgroud)
  1. 有没有办法在R中做到这一点?
  2. 在大量列的情况下,有没有办法在不为ifelse每一列写明确条件的情况下做同样的事情?

akr*_*run 5

我们可以names通过循环遍历行来子集

data$New <- apply(data[1:3], 1, function(x) paste(names(x[x!=0]), collapse="&"))
data$New
#[1] "A&B" "B"   "A&B" "C"   "B&C" "A&C"
Run Code Online (Sandbox Code Playgroud)

它也可以按列进行

library(tidyverse)
data[1:3] %>% 
    na_if(0) %>%
   `*`(col(.)) %>% 
   imap(~ rep(.y, length(.x))[.x]) %>%
   reduce(paste, sep= "&") %>% 
   str_remove("(NA&)+|(&NA)+") %>%
   str_remove("&NA")
#[1] "A&B" "B"   "A&B" "C"   "B&C" "A&C"
Run Code Online (Sandbox Code Playgroud)