如何将多列中逗号分隔的列值拆分为R中的行

时间:2017-10-23 13:22:56

标签: r dplyr reshape tidyverse

我有一个具有以下结构的数据框

Value1      Value2      Value3  
A,B,C       L,K         T
L           B,P         A
D,F,J       A,B,C       P

我想将此数据重新整理为以下格式

Value1      Value2      Value3  
A           L           T
B           L           T
C           L           T
A           K           T
B           K           T
C           K           T
L           B           A
L           P           A
D           A           P
F           A           P
J           A           P
D           B           P
F           B           P
J           B           P
D           C           P
F           C           P
J           C           P

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

read.table(stringsAsFactors = FALSE, header=TRUE, text="Value1      Value2      Value3  
A,B,C       L,K         T
L           B,P         A
D,F,J       A,B,C       P") -> xdf

library(tidyr)

separate_rows(xdf, Value1) %>%
  separate_rows(Value2)
##    Value3 Value1 Value2
## 1       T      A      L
## 2       T      A      K
## 3       T      B      L
## 4       T      B      K
## 5       T      C      L
## 6       T      C      K
## 7       A      L      B
## 8       A      L      P
## 9       P      D      A
## 10      P      D      B
## 11      P      D      C
## 12      P      F      A
## 13      P      F      B
## 14      P      F      C
## 15      P      J      A
## 16      P      J      B
## 17      P      J      C

答案 1 :(得分:0)

这给出了期望的结果:

d <- read.table(header=TRUE, text="Value1      Value2      Value3  
A,B,C       L,K         T
L           B,P         A
D,F,J       A,B,C       P")

myfun <- function(x) {
  expand.grid(strsplit(x[1], split=",")[[1]], strsplit(x[2], split=",")[[1]], strsplit(x[3], split=",")[[1]])
}

do.call(rbind, apply(d, 1, myfun))

对于您的数据,不需要上一个strplit()。您可以strsplit(x[3], split=",")[[1]]替换x[3]。最后,您要设置结果的列名:... <- names(d)