Объединение нескольких фреймов данных путем вставки альтернативных строк

У меня есть пространственные данные о погоде в Великобритании в текстовом формате Ascii за 7 лет (каждый файл/кадр данных содержит ежемесячные данные за один год — 12 столбцов и 52201 строк, поскольку каждая строка представляет одно местоположение). Я хочу объединить фреймы данных с альтернативными строками - 1-я строка фрейма данных 1, затем 1-я строка фрейма данных 2 до 1-й строки фрейма данных 7, затем 2-я строка фрейма данных 1 до 2-й строки фрейма данных 7 и продолжить ....

  V1    V2    V3    V4    V5    V6    V7    V8    V9   V10   V11   V12
-1199 -1199 -1199 -1199 -1199 -1199 -1199 -1199 -1199 -1199 -1199 -1199
-1299 -1299 -1299 -1299 -1299 -1299 -1299 -1299 -1299 -1299 -1299 -1299
-1399 -1399 -1399 -1399 -1399 -1399 -1399 -1399 -1399 -1399 -1399 -1399
-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999
-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999

Вот мой код:

n1<-read.table("data/y1call.txt", sep="")
n2<-read.table("data/y2call.txt", sep="")
n3<-read.table("data/y3call.txt", sep="")
c<-rbind(n1,n2,n3)
merge(n1,n2,n3)

Я пробовал merge, rbind, cbind, но все безуспешно.


person Naveed    schedule 14.11.2018    source источник


Ответы (1)


Вы можете создать новый столбец, представляющий rownames в каждом фрейме данных, и выполнить сортировку по этой переменной после того, как вы rbind, т.е.

ddf_all <- do.call(rbind, lapply(list(df1, df2, df3), function(i)transform(i, new = rownames(i))))
ddf_all[order(ddf_all$new),]

который дает,

   v1 v2 new
1   1  6   1
6  11 16   1
11 21 26   1
2   2  7   2
7  12 17   2
12 22 27   2
3   3  8   3
8  13 18   3
13 23 28   3
4   4  9   4
9  14 19   4
14 24 29   4
5   5 10   5
10 15 20   5
15 25 30   5

ДАННЫЕ:

df1 <- data.frame(v1 = c(1, 2, 3, 4, 5), V2 = c(6, 7, 8, 9, 10))
df2 <- data.frame(v1 = c(11, 12, 13, 14, 15), v2 = c(16, 17, 18, 19, 20))
df3 <- data.frame(v1 = c(21, 22, 23, 24, 25), v2 = c(26, 27, 28, 29, 30))
person Sotos    schedule 14.11.2018
comment
Уважаемый Сотос, спасибо за ваш вклад, и он работает хорошо, но все же есть некоторые неожиданные изменения. Поскольку последовательность/порядок строк должны быть 1,6,11, а затем 2,7,12 и так далее, но здесь, в моем случае, это 1,6,11, но не 2,7,12 и какой-то другой порядок. Знаете ли вы, почему это может произойти, или какое-либо другое решение? - person Naveed; 15.11.2018
comment
Я бы не знал, пока не увижу пример, который терпит неудачу. Я не вижу ничего плохого в рабочем процессе. Упорядочены ли отдельные фреймы данных? Вам нужно заказать их по отдельности, прежде чем добавить их в список? - person Sotos; 15.11.2018
comment
Ну, это мне не помогает. У меня нет файлов data/y1call.txt,... :) - person Sotos; 15.11.2018
comment
Могу ли я получить вашу электронную почту для отправки файлов и кода? Спасибо - person Naveed; 15.11.2018
comment
Просто добавьте пример набора данных, который выдает ошибку (вот ссылка о том, как сделать хороший пример) - person Sotos; 15.11.2018
comment
Когда я использую фрейм данных, содержащий более 10 строк, он создает другую последовательность строк, а не 1,1,1, а затем 2,2,2, на самом деле он составляет 1,1,1, затем 10,10,10, затем 11, 11,11. Если я использую меньше, чем фрейм данных, содержащий менее 10 строк, тогда он делает ту же последовательность, что и в вашем примере. Ошибки нет, просто вывод отличается от того, что я хочу, к сожалению. - person Naveed; 15.11.2018
comment
Пожалуйста, проверьте эти скриншоты: Скрипт: ссылка Входной файл: ссылка Выходной файл: ссылка - person Naveed; 15.11.2018