这是我的数据框架
>head(dat)
Var1 Freq
1 89 2
2 95 2
3 97 1
4 99 2
5 103 2
6 104 2
我希望迭代for
循环并使用dat$freq
附加cbind
。 Freq
出现Var1
时,是否可以将NA
附加到同一Freq
?
答案 0 :(得分:1)
我认为OP正在寻找merge
data.frames列表,而不是cbind
以下应该做的伎俩。
DF.LIST <- lapply(1:5, function(x) {
rows <- sample(1:5, 1)
data.frame(Var1 = sample(1:5, rows), Freq = sample(5:10, rows))
})
DF.LIST
## [[1]]
## Var1 Freq
## 1 2 6
## 2 4 7
## 3 3 9
## 4 5 10
##
## [[2]]
## Var1 Freq
## 1 3 10
## 2 2 9
##
## [[3]]
## Var1 Freq
## 1 4 5
## 2 3 6
##
## [[4]]
## Var1 Freq
## 1 1 6
## 2 2 10
## 3 5 7
## 4 3 9
## 5 4 8
##
## [[5]]
## Var1 Freq
## 1 5 10
##
选项1
问题Reduce
&amp;如果直接在此类列表中使用merge
组合,则它最终会与Var1
和Freq
列合并。为避免这种情况,我们首先通过添加索引号重命名每个data.frame中的第二列。之后,Reduce
和merge
组合应该提供OP想要的内容。
for (i in 1:length(DF.LIST)) {
names(DF.LIST[[i]]) <- c("Var1", paste0("Freq", i))
}
Reduce(function(...) merge(..., all = T), DF.LIST)
## Var1 Freq1 Freq2 Freq3 Freq4 Freq5
## 1 1 NA NA NA 6 NA
## 2 2 6 9 NA 10 NA
## 3 3 9 10 6 9 NA
## 4 4 7 NA 5 8 NA
## 5 5 10 NA NA 7 10
选项2
您可以直接尝试关注原始DF.LIST
,但仍需要在结果中处理列名称。
Reduce(function(...) merge(..., by = "Var1", all = T), DF.LIST)
## Var1 Freq.x Freq.y Freq.x Freq.y Freq
## 1 1 NA 6 NA 9 NA
## 2 2 7 NA NA 8 NA
## 3 3 NA 5 NA 7 7
## 4 4 NA 7 5 5 10
## 5 5 9 9 7 6 NA
Warning messages:
1: In merge.data.frame(..., by = "Var1", all = T) :
column names ‘Freq.x’, ‘Freq.y’ are duplicated in the result
2: In merge.data.frame(..., by = "Var1", all = T) :
column names ‘Freq.x’, ‘Freq.y’ are duplicated in the result