【发布时间】: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)) %>% arrange(Type, Sample)? -
感谢您的帮助。您的建议基本上是重新创建所需的数据框(更新之前)。我宁愿有一种方法来操纵初始数据框。