我有2个数据集:
数据1:
Var1 Var2 Var3 Var4
10 10 2 3
9 2 8 3
6 4 4 8
7 3 10 8
数据2:
Var1 Var5 Var3 Var6
3 6 6 4
1 2 5 1
9 2 2 9
2 6 3 2
现在我想附加这2个数据集
最终数据:
Var1 Var2 Var3 Var4 Var5 Var6
10 10 2 3
9 2 8 3
6 4 4 8
7 3 10 8
3 4 6 6
1 1 2 5
9 9 2 2
2 2 6 3
我无法使用rbind创建此数据集。有人可以告诉我创建这个数据集的方法吗?另外,假设我想附加多个(超过2个)数据集。程序是什么?
答案 0 :(得分:7)
我推荐rbind.fill
包的功能plyr
:
library(plyr)
rbind.fill(Data1, Data2)
# Var1 Var2 Var3 Var4 Var5 Var6
#1 10 10 2 3 NA NA
#2 9 2 8 3 NA NA
#3 6 4 4 8 NA NA
#4 7 3 10 8 NA NA
#5 3 NA 6 NA 6 4
#6 1 NA 5 NA 2 1
#7 9 NA 2 NA 2 9
#8 2 NA 3 NA 6 2
这种技术的主要优点是它不仅限于两个数据帧,而是允许组合任意数量的数据帧。
如果仍需要从磁盘读取数据,您可以执行以下操作:
file_list = list.files()
data_list = lapply(file_list, read.table)
data_combined = do.call("rbind.fill", data_list)
答案 1 :(得分:5)
merge(Data1, Data2, all=TRUE, sort=FALSE)
Var1 Var3 Var2 Var4 Var5 Var6
1 10 2 10 3 NA NA
2 9 8 2 3 NA NA
3 6 4 4 8 NA NA
4 7 10 3 8 NA NA
5 3 6 NA NA 6 4
6 1 5 NA NA 2 1
7 9 2 NA NA 2 9
8 2 3 NA NA 6 2
编辑:一种组合多个帧的方法 详见here。
Data3
Var1 Var3 Var5 Var6
1 2 6 4 1
2 10 1 6 1
3 1 6 3 1
4 9 5 5 7
我们需要将您的数据放入列表中并使用名为reshape
的精美包。
datalist <- list(Data1, Data2, Data3)
library(reshape)
merge_recurse(datalist)
Var1 Var3 Var2 Var4 Var5 Var6
1 10 2 10 3 NA NA
2 9 8 2 3 NA NA
3 6 4 4 8 NA NA
4 7 10 3 8 NA NA
5 3 6 NA NA 6 4
6 1 5 NA NA 2 1
7 9 2 NA NA 2 9
8 2 3 NA NA 6 2
9 2 6 NA NA 4 1
10 10 1 NA NA 6 1
11 1 6 NA NA 3 1
12 9 5 NA NA 5 7
答案 2 :(得分:1)
# Open a new directory and keep only the data files to be combined
combinedfiles <- function(){
# nullVar: Creating a Null Variable using as.null function
nullVar <- function(x){
x <- getwd();
x <- as.null(x);
}
# readTab: Read file using read.table function
readTab <- function(y) {
read.table(y, header=TRUE, sep = " ")
}
objectcontent <- nullVar(x);
for (i in 1:length(list.files(getwd()))) {
y <- list.files(getwd())[i];
objectcontent <- rbind(objectcontent, readTab(y));
i <- i + 1
}
return(objectcontent)
}
#Then type the following in the console
combinedfiles()
使用apply循环的版本(不受rbind减速影响):
combined_files = function(file_path, extension = "csv") {
require(plyr)
file_list = list.files(file_path, pattern = extension)
data_list = lapply(file_list, read.table, header = TRUE, sep = " ")
combined_data = do.call("rbind.fill", data_list)
return(combined_data)
}
答案 3 :(得分:0)
试试这个:
data1 <- as.data.frame(read.table("data1", header=TRUE, sep=" "))
data2 <- as.data.frame(read.table("data2", header=TRUE, sep=" "))
merge(data1, data2, all=TRUE, all.x=TRUE, all.Y=TRUE)