2015-03-15 2 views
1

0 Желаемый результат:: Я хотел бы объединить данные, такие как столбцы в DF2, которые находятся в DF1, привязаны по строкам к DF1; столбцы, которые находятся в DF1, но NOT в DF2 имеют нулевые (DF2) нули, добавленные к ним; и столбцы, которые находятся в DF2, но NOT в DF1 имеют нулевые нули (DF1), добавленные к ним, а затем эти столбцы привязаны к DF.Как скомбинировать dataframes с разными столбцами без слияния?

Что я пробовал: Я пытался использовать ncol, nrow и matrix для генерации частей финального df, но у меня возникают проблемы, такие как угловые случаи, когда второй DF имеет только один столбец и ncol (DF) возвращает NULL, например.

Шаблон для желаемого результата:

Для бывших, если у меня есть эти два ДФХ:

> DF_dummy_1 
    a b c e 
1 1 a f u 
2 2 b g v 
3 3 c h w 
4 4 d i x 
5 5 e j y 

> DF_dummy_2 
    a b d 
1 1 p k 
2 2 q l 
3 3 r m 
4 4 s n 
5 5 t o 

Я хотел бы закончить с

> DF_final 
    a b c e d 
1 1 a f u 0 
2 2 b g v 0 
3 3 c h w 0 
4 4 d i x 0 
5 5 e j y 0 
6 1 p 0 0 k 
7 2 q 0 0 l 
8 3 r 0 0 m 
9 4 s 0 0 n 
10 5 t 0 0 o 

код для генерации этого ex:

DF_dummy_1 <- data.frame("a" = seq(1:5), "b" = letters[1:5], "c" = letters[6:10], "e" = letters[21:25]) 
DF_dummy_2 <- data.frame("a" = seq(6:10), "b" = letters[16:20], "d" = letters[11:15]) 
DF_final <- data.frame("a" = seq(1:10), "b" = c(letters[1:5],letters[16:20]), 
         "c" = c(letters[6:10], rep("0",5)), 
         "e" = c(letters[21:25], rep("0",5)), 
         "d" = c(rep("0",5), letters[11:15])) 

ответ

2

Вы можете попробовать rbindlist с опцией fill=TRUE после размещения наборов данных в списке. (Только для удобства названы наборы данных как «df1», «df2»), по умолчанию «Nas» будет занимать недостающие строки, которые могут быть впоследствии заменены на 0.

library(data.table)#data.table_1.9.5 
rbindlist(list(df1, df2), fill=TRUE)[, 
     lapply(.SD, function(x) replace(x, is.na(x), 0))] 
# a b c e d 
# 1: 1 a f u 0 
# 2: 2 b g v 0 
# 3: 3 c h w 0 
# 4: 4 d i x 0 
# 5: 5 e j y 0 
# 6: 1 p 0 0 k 
# 7: 2 q 0 0 l 
# 8: 3 r 0 0 m 
# 9: 4 s 0 0 n 
#10: 5 t 0 0 o 

На основе данных» », обновленный в сообщении, некоторые из столбцов являются« факторами ». Вы можете использовать stringsAsFactors=FALSE в data.frame(..), чтобы избежать столкновений символов, преобразованных в factors. Учитывая эти factor колонны

rbindlist(list(DF_dummy_1, DF_dummy_2), fill=TRUE)[, 
    lapply(.SD, function(x) replace(as.character(x), is.na(x), 0))] 
# a b c e d 
#1: 1 a f u 0 
#2: 2 b g v 0 
#3: 3 c h w 0 
#4: 4 d i x 0 
#5: 5 e j y 0 
#6: 1 p 0 0 k 
#7: 2 q 0 0 l 
#8: 3 r 0 0 m 
#9: 4 s 0 0 n 
#10: 5 t 0 0 o 
+0

Я получаю сообщение об ошибке при попытке это: пункт 2 имеет 3 колонки, несовместимых с пунктом 1, который имеет 4 колонки – goldisfine

+1

@goldisfine Я использую 'data.table_1.9.5' версии разви , какая версия data.table у вас есть? – akrun

+0

А, понял. Есть ли простой способ обновления до 1.9.5? – goldisfine

Смежные вопросы