数据争用:重塑数据帧,使单元格中的多个值成为不同的行

时间:2017-02-15 17:56:27

标签: r dataframe reshape

我的数据看起来像这样

enter image description here

X            Y   Z    A          B         C
Qualify     10  35  us01    us03,ud05   um90,ug09
Identify    20  23  us02    us06, us01  us91,us93,us95

但必须将数据更改为显示如下。这样单元格内的数据就成了行。但是一些单元格具有奇异值,而一些单元格具有逗号分隔的多个单元格。因此,动态地,他们需要更改并放入新行,并重复其他列中的相同数据。

enter image description here

Identifier  Role    X       Y   Z
us01         A   Qualify    10  35
us03         B   Qualify    10  35
us05         B   Qualify    10  35
um90         C   Qualify    10  35
ug09         C   Qualify    10  35

我试过了cSplit,但它没有用,实际上变得更糟。

2 个答案:

答案 0 :(得分:0)

请参阅以下@alistaire的评论以获得更好的解决方案

这是否可以使用tidyr/dplyr,其中df是您的数据框:

df %>% separate(B, into=c("B1","B2")) %>%
       separate(C, into=c("C1","C2","C3")) %>%
       gather(Role,Id,A:C3)

给出了这个;

          X     Y     Z  Role    Id
      <chr> <int> <int> <chr> <chr>
1   Qualify    10    35     A  us01
2  Identify    20    23     A  us02
3   Qualify    10    35    B1  us03
4  Identify    20    23    B1  us06
5   Qualify    10    35    B2  ud05
6  Identify    20    23    B2  us01
7   Qualify    10    35    C1  um90
8  Identify    20    23    C1  us91
9   Qualify    10    35    C2  ug09
10 Identify    20    23    C2  us93
11  Qualify    10    35    C3  <NA>
12 Identify    20    23    C3  us95

答案 1 :(得分:0)

获得所需输出的一种非常天真的方式。当然不是最好的解决方案,但我想它会得到你想要的。

将数据集称为data

data <- tidyr::gather(data, "Role", "Identifier", 4:6)
data2 <- strsplit(data$Identifier, split = ",")
data2 <- data.frame(X = rep(data$X, sapply(data2, length)),
                    Y = rep(data$Y, sapply(data2, length)),
                    Z = rep(data$Z, sapply(data2, length)),
                    Role = rep(data$Role, sapply(data2, length)),
                    Identifier = unlist(data2))