1

我有 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

现在我想附加这两个数据集

最终数据:

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 个)数据集。程序是什么?

4

4 回答 4

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)
于 2012-09-23T17:07:39.560 回答
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

编辑:一种组合多个帧的方法,详见此处

合并超过 2 帧

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
于 2012-09-23T13:47:46.610 回答
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()

使用应用循环的版本(不受 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)
 }
于 2012-09-25T17:31:33.547 回答
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)
于 2012-09-23T14:27:15.733 回答