【问题标题】:Replicating rows for each unique group in dataframe为数据框中的每个唯一组复制行
【发布时间】:2018-07-24 19:32:41
【问题描述】:

我有一个这样的数据框:

Type  Sample  Version
C1    A       2
C1    A       4   
C1    A       6
C1    B       3
C1    B       5
C1    B       7
C1    C       1
C1    C       3
C1    C       5
C1    D       0
C1    D       0
C1    D       0
C1    D       0
C1    D       0
C1    D       0
C1    D       0
C1    D       0
.     .       .
C3    A       2
C3    A       4   
C3    A       6
C3    B       3
C3    B       5
C3    B       7
C3    C       1
C3    C       3
C3    C       5
C3    D       0
C3    D       0
C3    D       0
C3    D       0
C3    D       0
C3    D       0
C3    D       0
C3    D       0

我想为每个样本重复 8 行 D(A、B、C,除了 D 本身),并在复制的行中将样本 D 替换为已复制到的相应样本。

它基本上会将 D 的行添加到 A、B 和 C。将 D 重命名为 A、B 和 C。从数据框中删除 D。

最终的数据框如下所示:

Type  Sample  Version
C1    A       2
C1    A       4   
C1    A       6
C1    A       0
C1    A       0
C1    A       0
C1    A       0
C1    A       0
C1    A       0
C1    A       0
C1    A       0
C1    B       3
C1    B       5
C1    B       7
C1    B       0
C1    B       0
C1    B       0
C1    B       0
C1    B       0
C1    B       0
C1    B       0
C1    B       0    
C1    C       1
C1    C       3
C1    C       5
C1    C       0
C1    C       0
C1    C       0
C1    C       0
C1    C       0
C1    C       0
C1    C       0
C1    C       0

我想出了如何通过循环 Type 和 Sample 来实现这一点:

for(i in unique(dataframe$Type)){
 for(j in unique(dataframe$Sample)){
   tmp <- dataframe[which(dataframe$Type == i & dataframe$Sample == "D"),]
   tmp$Sample <- j
   dataframe <- rbind(dataframe, tmp)
 }
}

dataframe <- dataframe[which(dataframe$Sample != "D"),]

使用 dplyr 一定有更好的方法吗?

更新:我已经修改了最终的数据框,使其更接近真实案例场景,尽管它仍然是一个简化示例。

【问题讨论】:

  • expand.grid(Type = c("C1", "C2"), Sample = LETTERS[1:3], Version = c(1:3, 1:8)) %&gt;% arrange(Type, Sample)?
  • 感谢您的帮助。您的建议基本上是重新创建所需的数据框(更新之前)。我宁愿有一种方法来操纵初始数据框。

标签: r dplyr


【解决方案1】:

有了data.table,就有...

library(data.table)
setDT(DF)
DF[, {
  dd = .SD[Sample == "D", !"Sample"]
  .SD[Sample != "D", rbind(.SD, dd, fill=TRUE), by=Sample]
}, by=.(Type)]

给了

    Type Sample Version
 1:   C1      A       2
 2:   C1      A       4
 3:   C1      A       6
 4:   C1      A       0
 5:   C1      A       0
 6:   C1      A       0
 7:   C1      A       0
 8:   C1      A       0
 9:   C1      A       0
10:   C1      A       0
11:   C1      A       0
12:   C1      B       3
13:   C1      B       5
14:   C1      B       7
15:   C1      B       0
16:   C1      B       0
17:   C1      B       0
18:   C1      B       0
19:   C1      B       0
20:   C1      B       0
21:   C1      B       0
22:   C1      B       0
23:   C1      C       1
24:   C1      C       3
25:   C1      C       5
26:   C1      C       0
27:   C1      C       0
28:   C1      C       0
29:   C1      C       0
30:   C1      C       0
31:   C1      C       0
32:   C1      C       0
33:   C1      C       0
    Type Sample Version

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多