2014-10-05 31 views
0

所以,我有幾個dataframes這樣使用的,這取決於列合併合併在R指令值

1 2 a 
2 3 b 
3 4 c 
4 5 d 
3 5 e 
...... 

1 2 j 
2 3 i 
3 4 t 
3 5 r 
....... 

2 3 t 
2 4 g 
6 7 i 
8 9 t 
...... 

我想是的,我想所有這些文件合併到顯示的值一個單一的文件如果該對不存在,則爲列1和列2中的每對值以及0的第三列。

所以,輸出爲這將是,因爲有三個文件(還有更多)

1 2 aj0 
2 3 bit 
3 4 ct0 
4 5 d00 
3 5 er0 
6 7 00i 
8 9 00t 
...... 

我所做的是結合自己的所有文本文件.txt在單個列表中。 然後,

L <- lapply(seq_along(L), function(i) { 
    L[[i]][, paste0('DF', i)] <- 1 
    L[[i]] 
}) 

這將表明一個值的存在,當我們將它們合併。 我不知道如何進一步處理。任何投入都會很好。謝謝!

回答

2

這裏是Reduce

# function to generate dummy data 
gen_data<- function(){ 
    data.frame(
    x = 1:3, 
    y = 2:4, 
    z = sample(LETTERS, 3, replace = TRUE) 
) 
} 

# generate list of data frames to merge 
L <- lapply(1:3, function(x) gen_data()) 

# function to merge by x and y and concatenate z 
f <- function(x, y){ 
    d <- merge(x, y, by = c('x', 'y'), all = TRUE) 
    # set merged column to zero if no match is found 
    d[['z.x']] = ifelse(is.na(d[['z.x']]), 0, d[['z.x']]) 
    d[['z.y']] = ifelse(is.na(d[['z.y']]), 0, d[['z.y']]) 
    d$z <- paste0(d[['z.x']], d[['z.y']]) 
    d['z.x'] <- d['z.y'] <- NULL 
    return(d) 
} 



# merge data frames 
Reduce(f, L) 
+0

這是錯誤的,做這件事。它沒有考慮到某些配對的缺失。例如,通過你的代碼,將不會有一個具有以下序列的輸出:「ab0」。 – 2014-10-05 20:19:06

+1

我已編輯代碼添加0時,找不到匹配項。我建議你提供一個樣本數據集和所需的輸出,以便清楚你正在尋找什麼。 – Ramnath 2014-10-06 00:12:44