在r中使用merge命令进行合并,具体取决于列值

时间:2014-10-05 18:14:14

标签: 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]] 
})

当我们将它们合并时,这将指示存在值。 我不知道如何继续前进。任何输入都会很棒。谢谢!

1 个答案:

答案 0 :(得分: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)