我想将一个数据框附加到另一个数据框(主数据框)。问题是只有列的子集是常见的。此外,列的顺序可能不同。
掌握数据框:
a b c
r1 1 2 -2
r2 2 4 -4
r3 3 6 -6
r4 4 8 -8
新数据框:
d a c
r1 -120 10 -20
r2 -140 20 -40
预期结果:
a b c
r1 1 2 -2
r2 2 4 -4
r3 3 6 -6
r4 4 8 -8
r5 10 NaN -20
r6 20 NaN -40
有没有聪明的方法呢? This是一个类似的问题,但设置不同。
答案 0 :(得分:6)
查看bind_rows
包中的dplyr
功能。默认情况下,它会为您做一些很好的事情,例如填充一个data.frame
但不存在NA
s而不是仅失败的列。这是一个例子:
# Use the dplyr package for binding rows and for selecting columns
library(dplyr)
# Generate some example data
a <- data.frame(a = rnorm(10), b = rnorm(10))
b <- data.frame(a = rnorm(5), c = rnorm(5))
# Stack data frames
bind_rows(a, b)
Source: local data frame [15 x 3]
a b c
1 2.2891895 0.1940835 NA
2 0.7620825 -0.2441634 NA
3 1.8289665 1.5280338 NA
4 -0.9851729 -0.7187585 NA
5 1.5829853 1.6609695 NA
6 0.9231296 1.8052112 NA
7 -0.5801230 -0.6928449 NA
8 0.2033514 -0.6673596 NA
9 -0.8576628 0.5163021 NA
10 0.6296633 -1.2445280 NA
11 2.1693068 NA -0.2556584
12 -0.1048966 NA -0.3132198
13 0.2673514 NA -1.1181995
14 1.0937759 NA -2.5750115
15 -0.8147180 NA -1.5525338
要解决问题中的问题,您需要先选择主data.frame
中的列。如果a
是主data.frame
,并且b
包含您要添加的数据,则可以使用select
中的dplyr
函数获取列你需要先。
# Select all columns in b with the same names as in master data, a
# Use select_() instead of select() to do standard evaluation.
b <- select_(b, names(a))
# Combine
bind_rows(a, b)
Source: local data frame [15 x 2]
a b
1 2.2891895 0.1940835
2 0.7620825 -0.2441634
3 1.8289665 1.5280338
4 -0.9851729 -0.7187585
5 1.5829853 1.6609695
6 0.9231296 1.8052112
7 -0.5801230 -0.6928449
8 0.2033514 -0.6673596
9 -0.8576628 0.5163021
10 0.6296633 -1.2445280
11 2.1693068 NA
12 -0.1048966 NA
13 0.2673514 NA
14 1.0937759 NA
15 -0.8147180 NA
答案 1 :(得分:2)
试试这个:
library(plyr) # thanks to comment @ialm
df <- data.frame(a=1:4,b=seq(2,8,2),c=seq(-2,-8,-2))
new <- data.frame(d=c(-120,-140),a=c(10,20),c=c(-20,40))
# we use %in% to pull the columns that are the same in the master
# then we use rbind.fill to put in this dataframe below the master
# filling any missing data with NA values
res <- rbind.fill(df,new[,colnames(new) %in% colnames(df)])
> res
a b c
1 1 2 -2
2 2 4 -4
3 3 6 -6
4 4 8 -8
5 10 NA -20
6 20 NA 40
答案 2 :(得分:2)
此处发布的基于dplyr
- 和plyr
的解决方案分别使用bind_rows
和rbind.fill
进行此任务非常自然,尽管它也可以作为一个基础R中的-liner。基本上我会遍历第一个数据帧的名称,抓住第二个数据帧的相应列(如果它在那里或以其他方式返回所有NaN
值。
rbind(A, sapply(names(A), function(x) if (x %in% names(B)) B[,x] else rep(NaN, nrow(B))))
# a b c
# r1 1 2 -2
# r2 2 4 -4
# r3 3 6 -6
# r4 4 8 -8
# 5 10 NaN -20
# 6 20 NaN -40
答案 3 :(得分:1)
另一种选择是使用plyr包中的rbind.fill
toread <- "
a b c
1 2 -2
2 4 -4
3 6 -6
4 8 -8"
master <- read.table(textConnection(toread), header = TRUE)
toread <- "
d a c
-120 10 -20
-140 20 -40"
to.append <- read.table(textConnection(toread), header = TRUE)
library(plyr)
rbind.fill(master, to.append)