合并两个 data.frames 其中一个数据框包含一个额外的行
Merge two data.frames where one of the data frame contain an extra row
我有两个数据框,其中两个数据框都有一个公共列。其中一个数据框有一个额外的行。
> df1
type x y
1 A 10 417
2 B 2 575
3 C 3 14
4 D 944 205
5 E 44 87
6 F 355 883
7 G 73 150
> df2
X1 X2 X3 X4 X5 X6 term
1 9 28 3 34 5 39 B
2 43 7 39 41 46 32 C
3 17 30 0 27 0 9 D
4 42 32 1 10 26 49 E
5 21 17 34 28 35 12 F
6 16 10 18 25 2 0 G
我想在插入包含 term
A 的行时将 df1 中的 x,y 列附加到 df2,同时为其余列引入 NA
。
目标是获得:
X1 X2 X3 X4 X5 X6 x y term
NA NA NA NA NA NA 10 417 A
9 28 3 34 5 39 2 575 B
43 7 39 41 46 32 3 14 C
17 30 0 27 0 9 944 205 D
42 32 1 10 26 49 44 87 E
21 17 34 28 35 12 355 883 F
16 10 18 25 2 0 73 150 G
我尝试使用公共列作为 term
的合并功能,但没有成功,然后我找到了解决方案
cbindPad <- function(...){
args <- list(...)
n <- sapply(args,nrow)
mx <- max(n)
pad <- function(x, mx){
if (nrow(x) < mx){
nms <- colnames(x)
padTemp <- matrix(NA, mx - nrow(x), ncol(x))
colnames(padTemp) <- nms
if (ncol(x)==0) {
return(padTemp)
} else {
return(rbind(x,padTemp))
}
}
else{
return(x)
}
}
rs <- lapply(args,pad,mx)
return(do.call(cbind,rs))
}
但这也没有用。
使用merge
。请注意,常用列有不同的名称:type
对应 df1
,term
对应 df2
,因此您应该通过 [=17= 将此信息传递给 merge
函数] 和 by.y
个参数。同时设置all=TRUE
。
> merge(df1, df2, by.x="type", by.y="term", all=TRUE)
type x y X1 X2 X3 X4 X5 X6
1 A 10 417 NA NA NA NA NA NA
2 B 2 575 9 28 3 34 5 39
3 C 3 14 43 7 39 41 46 32
4 D 944 205 17 30 0 27 0 9
5 E 44 87 42 32 1 10 26 49
6 F 355 883 21 17 34 28 35 12
7 G 73 150 16 10 18 25 2 0
我有两个数据框,其中两个数据框都有一个公共列。其中一个数据框有一个额外的行。
> df1
type x y
1 A 10 417
2 B 2 575
3 C 3 14
4 D 944 205
5 E 44 87
6 F 355 883
7 G 73 150
> df2
X1 X2 X3 X4 X5 X6 term
1 9 28 3 34 5 39 B
2 43 7 39 41 46 32 C
3 17 30 0 27 0 9 D
4 42 32 1 10 26 49 E
5 21 17 34 28 35 12 F
6 16 10 18 25 2 0 G
我想在插入包含 term
A 的行时将 df1 中的 x,y 列附加到 df2,同时为其余列引入 NA
。
目标是获得:
X1 X2 X3 X4 X5 X6 x y term
NA NA NA NA NA NA 10 417 A
9 28 3 34 5 39 2 575 B
43 7 39 41 46 32 3 14 C
17 30 0 27 0 9 944 205 D
42 32 1 10 26 49 44 87 E
21 17 34 28 35 12 355 883 F
16 10 18 25 2 0 73 150 G
我尝试使用公共列作为 term
的合并功能,但没有成功,然后我找到了解决方案
cbindPad <- function(...){
args <- list(...)
n <- sapply(args,nrow)
mx <- max(n)
pad <- function(x, mx){
if (nrow(x) < mx){
nms <- colnames(x)
padTemp <- matrix(NA, mx - nrow(x), ncol(x))
colnames(padTemp) <- nms
if (ncol(x)==0) {
return(padTemp)
} else {
return(rbind(x,padTemp))
}
}
else{
return(x)
}
}
rs <- lapply(args,pad,mx)
return(do.call(cbind,rs))
}
但这也没有用。
使用merge
。请注意,常用列有不同的名称:type
对应 df1
,term
对应 df2
,因此您应该通过 [=17= 将此信息传递给 merge
函数] 和 by.y
个参数。同时设置all=TRUE
。
> merge(df1, df2, by.x="type", by.y="term", all=TRUE)
type x y X1 X2 X3 X4 X5 X6
1 A 10 417 NA NA NA NA NA NA
2 B 2 575 9 28 3 34 5 39
3 C 3 14 43 7 39 41 46 32
4 D 944 205 17 30 0 27 0 9
5 E 44 87 42 32 1 10 26 49
6 F 355 883 21 17 34 28 35 12
7 G 73 150 16 10 18 25 2 0