我下面有类似的数据。我想将数据格式转换为旺旺。
> data
ID X1 X2 X3 X4 X5 X6 X7
1 A Yes No Yes No Yes No No
2 B Yes No No No No No No
3 C No No No Yes Yes No No
4 D No No No No No No Yes
5 E No Yes No No No No No
6 F No No No No No No No
7 G No No No No No No No
8 H No No Yes No No No No
9 I No No No No No No No
10 J Yes No No Yes No No No
Want:
ID CODE
A X1
A X3
A X5
B X1
C X4
C X5
D X7
E X2
F NA
G NA
H X3
I NA
J X1
J X4
我已经尝试了许多方法,但是无法解决。感谢您的帮助
tidyverse
中的一种方法是获取长格式的数据,使用value == 'Yes'
选择行,并使用complete
添加缺失的级别。
library(dplyr)
library(tidyr)
df %>%
pivot_longer(cols = -ID) %>%
filter(value == "Yes") %>%
complete(ID = levels(ID)) %>%
select(-value)
# A tibble: 14 x 2
# ID name
# <chr> <chr>
# 1 A X1
# 2 A X3
# 3 A X5
# 4 B X1
# 5 C X4
# 6 C X5
# 7 D X7
# 8 E X2
# 9 F NA
#10 G NA
#11 H X3
#12 I NA
#13 J X1
#14 J X4
在基数R中,我们可以将which
与merge
结合使用>
mat <- which(df == "Yes", arr.ind = TRUE) temp <- data.frame(ID = df$ID[mat[, 1]], Code = names(df)[mat[, 2]]) merge(data.frame(ID = levels(df$ID)), temp, all.x = TRUE)
请确保
df1$ID
属于因子类。
通过基R的选项可以使用stack
,即
这里是使用apply()
的R基础解决方案>
code <- apply(data, 1, function(x) {ifelse(sum(x =="Yes") == 0,r <- NA,r <- names(df)[which(x=="Yes")]);r})
id <- rep(data$ID,lengths(code))
dfout <- data.frame(ID = id, CODE = unlist(code))