3

我正在尝试将数据框中的一列拆分为多列,这些列将原始列中的值作为新列名。然后,如果在原始列中出现相应列,则在新列中将其设为 1,如果不匹配,则为 0。我意识到这不是最好的解释方式,例如:

df <- data.frame(subject = c(1:4), Location = c('A', 'A/B', 'B/C/D', 'A/B/C/D'))  

#   subject Location  
# 1       1     A                                  
# 2       2     A/B                                   
# 3       3     B/C/D                                 
# 4       4     A/B/C/D

并希望将其扩展为宽格式,例如使用 1 和 0(或 T 和 F):

#   subject    A  B  C  D
# 1       1    1  0  0  0
# 2       2    1  1  0  0
# 3       3    0  1  1  1
# 4       4    1  1  1  1  

我已经研究tidyrseparate函数和reshape2函数,cast但似乎对给出逻辑值很感兴趣。对此问题的任何帮助将不胜感激。谢谢你。

4

2 回答 2

5

You may try cSplit_e from package splitstackshape:

library(splitstackshape)
cSplit_e(data = df, split.col = "Location", sep = "/",
         type = "character", drop = TRUE, fill = 0)
#   subject Location_A Location_B Location_C Location_D
# 1       1          1          0          0          0
# 2       2          1          1          0          0
# 3       3          0          1          1          1
# 4       4          1          1          1          1
于 2015-01-21T21:43:53.220 回答
1

您可以采取以下分步方法。

## get the unique values after splitting
u <- unique(unlist(strsplit(as.character(df$Location), "/")))
## compare 'u' with 'Location' 
m <- vapply(u, grepl, logical(length(u)), x = df$Location)
## coerce to integer representation
m[] <- as.integer(m)
## bind 'm' to 'subject'
cbind(df["subject"], m)
#   subject A B C D
# 1       1 1 0 0 0
# 2       2 1 1 0 0
# 3       3 0 1 1 1
# 4       4 1 1 1 1
于 2015-01-21T21:35:47.113 回答