我有一个包含0或1的R数据框,其中有3列。当值为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
输出:
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
代码和输出使用“&”分隔符:
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
预期输出:
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
- 有没有在 R 中实现这个的方法?
- 如果列数很多,是否有一种方法可以在不对每列都编写明确的
ifelse
条件的情况下完成相同的操作?
data[1:3] %>% na_if(0) %>%
*(col(.)) %>% imap(~ rep(.y, length(.x))[.x]) %>% reduce(paste, sep= "&") %>% str_remove("(NA&)+|(&NA)+") %>% str_remove("&NA")
- akrun