Объединение и слияние последовательности кадров данных

У меня есть последовательность из 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)) {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))}

У меня есть этот список последовательности фреймов данных, которые я хочу объединить в один комбинированный фрейм данных. Я пробовал это:

total <- rbind(d1, d2,d3)

Но получил ошибку.

Error in match.names(clabs, names(xi)) : 
  names do not match previous names

Используя другой подход:

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 

Но опять ошибка.

Error in data.frame(..., check.names = FALSE) : 
  arguments imply differing number of rows: 3, 5

Было бы здорово получить ответ, используя тот же подход (rbind) и более базовый подход. Оба помогут в моем понимании. Конечно, пожалуйста, укажите, где я ошибаюсь, если это очевидно.


person Laura Esly    schedule 20.02.2015    source источник
comment
имена столбцов (и количество столбцов) должны быть одинаковыми для всех фреймов данных, чтобы rbind работал.   -  person Metrics    schedule 20.02.2015


Ответы (1)


Просто используйте names(df) в этом случае после rbinding. Каждый фрейм данных, который вы rbind должны иметь одинаковые имена столбцов. От ?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

И еще несколько замечаний по поводу вашего примера: вместо использования d1 <- rbind(d1, c(...)) вы можете просто сделать: d1 <- data.frame(a = i + 1, b = i + 2, c = i + 3). И тогда вам даже не нужно переименовывать ваши столбцы, так как все они остаются как есть.

person Peter Diakumis    schedule 20.02.2015