我想将多个表中的选择列与以下组织合并(合并)。
这里有两个数据集作为我想要组合的例子
"dataset1"
A B C D E F (header)
1 2 3 4 5 F1(1st row)
6 7 8 9 10 F2(2nd row)
11 12 13 14 15 F3 (3rd row)
....
"dataset2"
A B C D E F (header)
16 17 18 19 20 F1(1st row)
21 22 23 24 25 F2(2nd row)
26 27 28 29 30 F3 (3rd row)
....
这里,所有不同数据集(我有超过100个数据集)的标题是相同的,我想使用F列中的名称(F1,F2,F3 ...超过F200)作为唯一标识符。 例如,如果我使用列F作为标识符组合来自所有不同数据集的列“A”,则结果应如下所示。另外,为了区分数据的来源,还需要将标题更改为数据集ID。
dataset1 dataset2 F (header)
1 16 F1 (1st row)
6 21 F2 (2nd row)
11 26 F3 (3rd row)
....
请注意,我所有的数据集都包含不同的行数,因此可能会丢失与F1~F200对应的某些数据点值。在这种情况下,我想把NA或留空。
为此,我尝试了以下代码
x <- merge(dataset1, dataset2, by="F", all=T)
但是这样,我不能仅提取A列,而是合并外部列。
同样,我也试过
x <- Reduce(function(x, y) merge(x, y, all=TRUE, by=("F")), list(dataset1, dataset2))
这给了我与之前代码完全相同的结果。为了使用此代码进一步仅提取列A,我尝试了一个,但没有奏效。
x <- Reduce(function(x, y) merge(x, y, all=TRUE, by=("F")), list(dataset1[,1], dataset2[,1))
我不知道如何将标题名称更改为来自的数据集名称。
请理解我刚刚开始学习R基础知识。
我正在使用RStudio 0.98507,目前所有数据集(超过100个)都已加载并存在于“全球环境”中
非常感谢!
答案 0 :(得分:1)
以下是一个包含以下四个示例数据框的解决方案:
dataset1 <- data.frame(A = c(1, 6, 11),
B = c(2, 7, 12),
C = c(3, 8, 12),
D = c(4, 9, 13),
E = c(5, 10, 14),
F = c("F1", "F2", "F3"))
dataset2 <- data.frame(A = c(16, 21, 26),
B = c(17, 22, 27),
C = c(18, 23, 28),
D = c(19, 24, 29),
E = c(20, 25, 30),
F = c("F1", "F2", "F3"))
dataset3 <- data.frame(A = c(30, 61),
B = c(57, 90),
C = c(38, 33),
D = c(2, 16),
E = c(77, 25),
F = c("F1", "F2"))
dataset4 <- data.frame(A = c(36, 61),
B = c(47, 30),
C = c(37, 33),
D = c(45, 10),
E = c(66, 29),
F = c("F1", "F2"))
首先将它们组合成一个列表:
datasets <- list(dataset1, dataset2, dataset3, dataset4)
然后重命名除F
列以外的所有列。这是因为稍后当我们将数据框合并在一起时,如果列都具有相同的名称,那么merge
将尝试通过向名称添加.x
或.y
来区分它们 - 当你只合并两个数据集时很好,但是两个以上的数据集会混淆。
for (i in seq_along(datasets)) {
for (j in seq_along(colnames(datasets[[i]]))) {
if (colnames(datasets[[i]])[j] != "F") {
colnames(datasets[[i]])[j] <- paste(colnames(datasets[[i]])[j], i, sep = ".")
}
}
}
这为我们提供了数据框,其列标题如下所示:
datasets[[1]]
## A.1 B.1 C.1 D.1 E.1 F
## 1 1 2 3 4 5 F1
## 2 6 7 8 9 10 F2
## 3 11 12 12 13 14 F3
然后使用Reduce
:
df <- Reduce(function(x, y) merge(x, y, all = TRUE, by = "F"), datasets)
并选择所需的列,在这种情况下,列名称中包含A
的所有列:
df[, c("F", grep("A", names(df), value = TRUE))]
## F A.1 A.2 A.3 A.4
## 1 F1 1 16 30 36
## 2 F2 6 21 61 61
## 3 F3 11 26 NA NA