在多列中输入“是”时如何将行与列匹配

问题描述 投票:-1回答:3

我下面有类似的数据。我想将数据格式转换为旺旺。

> 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

我已经尝试了许多方法,但是无法解决。感谢您的帮助

r dataframe
3个回答
2
投票

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中,我们可以将whichmerge结合使用>

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属于因子类。


1
投票

通过基R的选项可以使用stack,即


0
投票

这里是使用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))
© www.soinside.com 2019 - 2024. All rights reserved.