2016-09-27 7 views
1

Я использую R для анализа нескольких экспериментов, в которых результаты хранятся в нескольких файлах CSV. Я бегу table() для табулирования данных и получить результаты как следующийR Слияние Таблицы данных из разных файлов

Tabulations of Combination1.csv 
A 1000 
B 50 
C 200    
Tabulations of Combination2.csv 
A 25 
B 1500 
D 30 
Tabulations of Combination3.csv 
B 19 
C 500 
E 2000 

Я хочу, чтобы построить таблицу, которая сочетает в себе эти табличные данные.

Combination A  B  C  D E 
c1   1000 50 200 N/A N/A 
c2   25 1500 N/A 30 N/A 
c3   N/A 19 500 N/A 2000  

ответ

1

Вот как я хотел бы сделать это с помощью tidyr и dplyr:

данных

c1 <- rep(LETTERS[1:3], c(1000, 50, 200)) 
c2 <- rep(LETTERS[c(1:2, 4)], c(25, 1500, 30)) 
c3 <- rep(LETTERS[c(2:3, 5)], c(19, 500, 2000)) 

Код

library(tidyr) 
library(plyr) 
allC <- list(c1 = c1, c2 = c2, c3 = c3) 
# get all tables in data.frame format 
ldply(names(allC), function(x) { 
    tab <- table(allC[[x]]) 
    data.frame(Combination = x, element = names(tab), Freq = c(tab)) 
}) %>% spread(element, Freq) 

# Combination A B C D E 
# 1   c1 1000 50 200 NA NA 
# 2   c2 25 1500 NA 30 NA 
# 3   c3 NA 19 500 NA 2000 

Объяснение

Вы превращаетесь все таблицы в data.frame первой, где вы добавите имя соответствующего элемента. Затем вы используете spread для распространения значений.

+0

Я использую parLapply (clus, comboName, function (x) {table (read.csv (x) $ code)}), чтобы создать список 'allC'. Как добавить comboName в возвращаемые списки? – Wanderer

+0

В моем примере 'allC' содержит все _raw data_ (* не * таблицу). Поэтому я предполагаю (предполагая, что 'comboName' содержит имена' * .csv'), вам нужно сделать что-то вроде 'allC <- setNames (parLapply (clus, comboName, function (x) read.csv (x) $ code), comboName). Это считывает столбец 'code' каждого' csv' в список и присваивает ему имя 'comboName'. Тогда вы должны иметь возможность напрямую использовать 'ldply', как в моем примере. – thothal

+0

Спасибо, Тотол. Я попытался использовать setNames внутри функции parLapply, которая явно не сработала. Я удивлен, что работает с параллельным порядком операций, но я рад, что это так. – Wanderer

0
library(dplyr) 
library(tidyr) 

x <- table(c(rep("A", 1000), rep("B", 50), rep("C", 200))) 
y <- table(c(rep("A", 25), rep("B", 1500), rep("D", 30))) 
z <- table(c(rep("B", 19), rep("C", 500), rep("E", 2000))) 

X <- data.frame(x) %>% spread(Var1, Freq) 
Y <- data.frame(y) %>% spread(Var1, Freq) 
Z <- data.frame(z) %>% spread(Var1, Freq) 

X %>% full_join(Y) %>% full_join(Z) %>% 
    mutate(Combination = paste0("c", seq(1,3))) 

Результат:

> X %>% full_join(Y) %>% full_join(Z) %>% 
+ mutate(Combination = paste0("c", seq(1,3))) 
Joining, by = c("A", "B") 
Joining, by = c("B", "C") 
    A B C D E Combination 
1 1000 50 200 NA NA   c1 
2 25 1500 NA 30 NA   c2 
3 NA 19 500 NA 2000   c3 

Пожалуйста, подумайте в следующий раз, чтобы обеспечить x, y и z объекты для воспроизводимой например :)

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