我希望一切顺利。我正在写关于R中一个非常具体的问题,到目前为止我还无法在网上找到解决方案。如果问题已在其他地方得到解决,我很抱歉打扰你,但如果你能给我提供链接,我将不胜感激。
我有3个独立的数据集:
第一个是公司列表。第二个是年份清单。第三个是国家名单。
我的目标是将这3个数据集合并到一个新的数据框中。最终数据框应为这3个变量的每个组合创建数据行。这就是我无法使用merge()函数的原因。下一步,我想要沿着这个新创建的数据框匹配数据。
非常感谢你的支持 - 如果这个问题已在其他地方得到解决,再次感到抱歉!
答案 0 :(得分:0)
尝试merge
:
A <- data.frame(Companies = LETTERS[1:3])
B <- data.frame(Years = 2000:2002)
C <- data.frame(Countries = c("GER", "UK", "US"))
X <- merge(merge(A, B), C)
X
Companies Years Countries
1 A 2000 GER
2 B 2000 GER
3 C 2000 GER
4 A 2001 GER
5 B 2001 GER
6 C 2001 GER
7 A 2002 GER
8 B 2002 GER
9 C 2002 GER
10 A 2000 UK
...
如果您有超过3个变量/因子,您可以编写自己的合并函数,如下所示:
mergeN <- function(dfs = NULL) {
if(is.null(dfs) | class(dfs) != "list") stop("'dfs' is not a list!")
if(length(dfs) > 1) {
dfs[[1]] <- merge(dfs[[1]], dfs[[2]])
dfs[[2]] <- NULL
Recall(dfs)
} else {
return(dfs[[1]])
}
}
D <- data.frame(Products = letters[24:26])
E <- data.frame(Divisions = c(100,200,300))
mergeN(list(A, B, C, D, E))
这将为您提供所有3 ^ 5 = 243种组合的数据框。
由于评论而更新:
A <- data.frame(Companies = LETTERS[1:3])
B <- data.frame(Years = 2000:2002)
C <- data.frame(Countries = c("GER", "UK", "US"))
X <- merge(merge(A, B), C)
Y <- data.frame(Companies = LETTERS[1:3], Years = rep(2000,3), Countries = c("GER", "UK", "US"), Revenues = c(20433,23255,32164))
merge(X, Y, all=T)
Companies Years Countries Revenues
1 A 2000 GER 20433
2 A 2000 UK NA
3 A 2000 US NA
4 A 2001 GER NA
5 A 2001 UK NA
6 A 2001 US NA
7 A 2002 GER NA
8 A 2002 UK NA
9 A 2002 US NA
10 B 2000 GER NA
11 B 2000 UK 23255
12 B 2000 US NA
13 B 2001 GER NA
14 B 2001 UK NA
15 B 2001 US NA
16 B 2002 GER NA
17 B 2002 UK NA
18 B 2002 US NA
19 C 2000 GER NA
20 C 2000 UK NA
21 C 2000 US 32164
22 C 2001 GER NA
23 C 2001 UK NA
24 C 2001 US NA
25 C 2002 GER NA
26 C 2002 UK NA
27 C 2002 US NA
(如果您希望NA&#39; s为Z[is.na(Z)] <- 0
)
答案 1 :(得分:0)
借用来自@Martin的输入数据框,这是一种方法,涉及将所有数据框放在list
中,然后使用Reduce()
:
d1 <- data.frame(Companies = LETTERS[1:3])
d2 <- data.frame(Years = 2000:2002)
d3 <- data.frame(Countries = c("GER", "UK", "US"))
d4 <- data.frame(Companies = LETTERS[1:3], Years = rep(2000,3), Countries = c("GER", "UK", "US"), Revenues = c(20433,23255,32164))
d <- list(d1, d2, d3, d4)
merged_dat <- Reduce(function(...) merge(..., all=T), d)
head(merged_dat)
#> Companies Years Countries Revenues
#> 1 A 2000 GER 20433
#> 2 A 2000 UK NA
#> 3 A 2000 US NA
#> 4 A 2001 GER NA
#> 5 A 2001 UK NA
#> 6 A 2001 US NA
我更喜欢这个,因为它可以推广到你可能拥有的数据帧。