R 组合和合并一系列数据帧
我有n个数据帧的序列,其形式如下:R 组合和合并一系列数据帧,r,loops,for-loop,dataframe,rbind,R,Loops,For Loop,Dataframe,Rbind,我有n个数据帧的序列,其形式如下: n<-10 k<-5 d1 <- data.frame() for(i in 1:(k)) {d1 <- rbind(d1,c(a="i+1",b="i-1",c="i/1"))} d2 <- data.frame() for(i in 1:(k+2)) {d2 <- rbind(d2,c(a="i+2",b="i-2",c="i/2"))} d3 <- data.frame() for(i in 1:(k+3))
n<-10
k<-5
d1 <- data.frame()
for(i in 1:(k)) {d1 <- rbind(d1,c(a="i+1",b="i-1",c="i/1"))}
d2 <- data.frame()
for(i in 1:(k+2)) {d2 <- rbind(d2,c(a="i+2",b="i-2",c="i/2"))}
d3 <- data.frame()
for(i in 1:(k+3)) {d3 <- rbind(d3,c(i+3, i-3, i/3))}
...
d10 <- data.frame()
for(i in 1:(k+10)) {d10 <- rbind(d10,c(i+10, i-10, i/10))}
使用其他方法:
D <- list(d1,d2,d3)
newD <- data.frame()
for(i in 1:length(D)) {
newD <- rbind(newD, cbind(frame=rep(i,length(D[[i]])),D[[i]]))
}
newD
使用相同的方法(rbind)和更基本的方法得到答案将非常好。两者都有助于我的理解。当然,如果有明显的错误,请指出我的错误所在。在本例中,只需在rbind
ing之后使用names(df)
。rbind
中的每个数据帧都需要具有相同的列名。从?rbind
:
k<-5
d1 <- data.frame()
for(i in 1:(k)) {d1 <- rbind(d1,c(a=i+1,b=i-1,c=i/1)); names(d1) <- letters[1:3]}
d2 <- data.frame()
for(i in 1:(k+2)) {d2 <- rbind(d2,c(a=i+2,b=i-2,c=i/2)); names(d2) <- letters[1:3]}
d3 <- data.frame()
for(i in 1:(k+3)) {d3 <- rbind(d3,c(a=i+3, b=i-3, c=i/3)); names(d3) <- letters[1:3]}
> rbind(d1, d2, d3)
a b c
1 2 0 1.0000000
2 3 1 2.0000000
3 4 2 3.0000000
4 5 3 4.0000000
5 6 4 5.0000000
6 3 -1 0.5000000
7 4 0 1.0000000
8 5 1 1.5000000
9 6 2 2.0000000
10 7 3 2.5000000
11 8 4 3.0000000
12 9 5 3.5000000
13 4 -2 0.3333333
14 5 -1 0.6666667
15 6 0 1.0000000
16 7 1 1.3333333
17 8 2 1.6666667
18 9 3 2.0000000
19 10 4 2.3333333
20 11 5 2.6666667
…然后它从第一个数据帧获取列的类,并按名称(而不是位置)匹配列
因此,对于您的示例,您只需要为每个数据帧指定相同的列名即可rbind
:
k<-5
d1 <- data.frame()
for(i in 1:(k)) {d1 <- rbind(d1,c(a=i+1,b=i-1,c=i/1)); names(d1) <- letters[1:3]}
d2 <- data.frame()
for(i in 1:(k+2)) {d2 <- rbind(d2,c(a=i+2,b=i-2,c=i/2)); names(d2) <- letters[1:3]}
d3 <- data.frame()
for(i in 1:(k+3)) {d3 <- rbind(d3,c(a=i+3, b=i-3, c=i/3)); names(d3) <- letters[1:3]}
> rbind(d1, d2, d3)
a b c
1 2 0 1.0000000
2 3 1 2.0000000
3 4 2 3.0000000
4 5 3 4.0000000
5 6 4 5.0000000
6 3 -1 0.5000000
7 4 0 1.0000000
8 5 1 1.5000000
9 6 2 2.0000000
10 7 3 2.5000000
11 8 4 3.0000000
12 9 5 3.5000000
13 4 -2 0.3333333
14 5 -1 0.6666667
15 6 0 1.0000000
16 7 1 1.3333333
17 8 2 1.6666667
18 9 3 2.0000000
19 10 4 2.3333333
20 11 5 2.6666667
k所有数据帧的列名称(和列数)应相同,以便rbind
正常工作。
Error in data.frame(..., check.names = FALSE) :
arguments imply differing number of rows: 3, 5
k<-5
d1 <- data.frame()
for(i in 1:(k)) {d1 <- rbind(d1,c(a=i+1,b=i-1,c=i/1)); names(d1) <- letters[1:3]}
d2 <- data.frame()
for(i in 1:(k+2)) {d2 <- rbind(d2,c(a=i+2,b=i-2,c=i/2)); names(d2) <- letters[1:3]}
d3 <- data.frame()
for(i in 1:(k+3)) {d3 <- rbind(d3,c(a=i+3, b=i-3, c=i/3)); names(d3) <- letters[1:3]}
> rbind(d1, d2, d3)
a b c
1 2 0 1.0000000
2 3 1 2.0000000
3 4 2 3.0000000
4 5 3 4.0000000
5 6 4 5.0000000
6 3 -1 0.5000000
7 4 0 1.0000000
8 5 1 1.5000000
9 6 2 2.0000000
10 7 3 2.5000000
11 8 4 3.0000000
12 9 5 3.5000000
13 4 -2 0.3333333
14 5 -1 0.6666667
15 6 0 1.0000000
16 7 1 1.3333333
17 8 2 1.6666667
18 9 3 2.0000000
19 10 4 2.3333333
20 11 5 2.6666667