2017-02-15 46 views
0

我的数据看起来像这样数据角力:重塑数据帧,使得在小区中的多个值成为不同的行

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,但它没有工作,变得更糟实际。

+0

“pivotting/unpivotting”可以用'melt'和'cast'(以获得良好性能使用大数据表时使用'data.table'包,它提供了一个很好的实现这些功能)进行 –

回答

0

看到下面的一个更好的解决方案

@alistaire评论是否使用tidyr/dplyr这项工作,其中DF ID数据帧:

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

不确定列A,B和C中的值的数量在长度上是不同的还是与问题中的相同。 – krish

+0

非常感谢!但是如果我们不知道B或C下有多少单独的价值呢?或者在这些专栏中有更多的数字值比以前的想法。而不是B1/B2或C1/C2/C3;我无法获得相同的价值。因此,对于原始数据中的B列下的所有值,在新数据框中将B值视为行单元格。 – Rev

+0

A,B和C下的值在长度上有所不同。 – Rev

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)) 
+0

当我尝试这种方法时出现错误。也许我做错了什么。但上面的解决方案工作。谢谢!!! – Rev

+0

我刚刚用相同的数据集检查了代码。它似乎工作正常。你有什么错误?是的,评论中的解决方案是解决这个问题的一种更好的方法。 – krish