R-连接两个数据帧?

R-连接两个数据帧?,r,dataframe,concatenation,R,Dataframe,Concatenation,给定两个数据帧a和b: > a a b c 1 -0.2246894 -1.48167912 -1.65099363 2 0.5559320 -0.87898575 -0.15634590 3 1.8469466 -0.01487524 -0.53098215 4 -0.6875051 0.23880967 0.01824621 5 -0.6735163 0.75485292 0.44154092 > b

给定两个数据帧
a
b

> a
           a           b           c
1 -0.2246894 -1.48167912 -1.65099363
2  0.5559320 -0.87898575 -0.15634590
3  1.8469466 -0.01487524 -0.53098215
4 -0.6875051  0.23880967  0.01824621
5 -0.6735163  0.75485292  0.44154092


> b
           a          c
1  0.4287284 -0.3295925
2  0.5201492  0.3341251
3 -2.6355570  1.7916780
4 -1.3645337  1.3642276
5 -0.4954542 -0.6660001
是否有一种简单的方法来连接这些数据帧,以便返回以下格式的新数据帧

> new
           a                   b           c
1  -0.2246894   -1.48167912106676 -1.65099363
2   0.5559320  -0.878985746842256 -0.15634590
3   1.8469466 -0.0148752354840942 -0.53098215
4  -0.6875051   0.238809666690982  0.01824621
5  -0.6735163   0.754852923524198  0.44154092
6   0.4287284                  NA -0.32959248
7   0.5201492                  NA  0.33412510
8  -2.6355570                  NA  1.79167801
9  -1.3645337                  NA  1.36422764
10 -0.4954542                  NA -0.66600006
我想合并数据帧,匹配标题,并在数据帧
b
中缺少标题的位置插入
NA

您想要“rbind”

b$b
a c
1  9 12
2 10 13
3 11 14
>b$b
a、c、b
1 9 12 NA
21013NA
3114 NA
>新的
a、b、c
1  0  3  6
2  1  4  7
3  2  5  8
4 9 NA 12
5 10 NA 13
6 11 NA 14
试试这个软件包:


您可以使用
rbind
,但在这种情况下,两个表中的列数必须相同,因此请尝试以下操作:

b$b<-as.double(NA) #keeping numeric format is essential for further calculations
new<-rbind(a,b)

b$b这里有一个简单的小函数,可以在自动检测每个数据集中缺少哪些列并将它们与所有
NA
s一起添加后,将两个数据集绑定在一起

无论出于何种原因,在较大的数据集上,这比使用
merge
函数返回的速度要快得多

fastmerge <- function(d1, d2) {
  d1.names <- names(d1)
  d2.names <- names(d2)

  # columns in d1 but not in d2
  d2.add <- setdiff(d1.names, d2.names)

  # columns in d2 but not in d1
  d1.add <- setdiff(d2.names, d1.names)

  # add blank columns to d2
  if(length(d2.add) > 0) {
    for(i in 1:length(d2.add)) {
      d2[d2.add[i]] <- NA
    }
  }

  # add blank columns to d1
  if(length(d1.add) > 0) {
    for(i in 1:length(d1.add)) {
      d1[d1.add[i]] <- NA
    }
  }

  return(rbind(d1, d2))
}

fastmerge您可以使用该函数

bind_行(a,b)


从库中

我猜您已经尝试了
merge()
?为什么不起作用?我没有,安德烈-所以我会+1你让我去doh!我很困惑。达伦的操作不是一个连接——不存在“笛卡尔积”。相反,它是一个直接连接。那么连接有什么帮助呢?如果你要得到两个以上数据帧的并集,你可以使用
Reduce(rbind,list\u of\u data\u frames)
将它们混合在一起!如果你是
rbind
出于某种奇怪的原因来自base:我使用了
rbind.data.frame
避免使用外部包来完成简单的任务。这比仅仅为了取悦rbind而在额外的列中进行黑客攻击更清晰、更容易;这是正确的前进方向。在为作业提供正确的工具时,避免使用极其常见的软件包,如
plyr
,这是不明智的。此函数会自动进行因子合并。这比公认的答案要好得多
plyr
是一个非常普通的软件包。这个小功能非常棒。我只是想发布同样的答案:-)。一个改进:@Anton在他的回答中将
NA
改为
double
。如果新列的类型与另一个数据框中现有列的类型相同,那就更好了。可能通过
模式(d2[d2.add[i]])与
cbind
rbind
)不同,如果存在字符向量,此函数不会将所有列(行)的类型更改为
因子。
rbind.fill(a,b,c)
b$b<-as.double(NA) #keeping numeric format is essential for further calculations
new<-rbind(a,b)
fastmerge <- function(d1, d2) {
  d1.names <- names(d1)
  d2.names <- names(d2)

  # columns in d1 but not in d2
  d2.add <- setdiff(d1.names, d2.names)

  # columns in d2 but not in d1
  d1.add <- setdiff(d2.names, d1.names)

  # add blank columns to d2
  if(length(d2.add) > 0) {
    for(i in 1:length(d2.add)) {
      d2[d2.add[i]] <- NA
    }
  }

  # add blank columns to d1
  if(length(d1.add) > 0) {
    for(i in 1:length(d1.add)) {
      d1[d1.add[i]] <- NA
    }
  }

  return(rbind(d1, d2))
}