【问题标题】:How to do conditional merge如何进行条件合并
【发布时间】:2020-05-15 11:56:59
【问题描述】:

我有 2 个数据框,我正在尝试使用条件进行内部连接。我将展示一个示例来阐明我想要做什么:

A
  cnumero cep numero bairro
1  124,35 124     35      K
2  375,NA 375     NA      L
3   NA,28  NA     28      M

B

  cnumero bairro XY
1  124,35      J  1
2  375,48      L  2
3  135,28      M  3

合并的第一个条件是,如果A$cep != NAA$numero != NA,则使用cnumero列进行连接,否则使用bairro列进行连接,结果:

new_A
  cnumero cep numero XY
1  124,35 124     35  1
2  375,NA 375     NA  2
3   NA,28  NA     28  3

到目前为止,我所做的是使用以下方法进行内部连接: A[A$cnumero %in% unique(B$cnumero),],因为在我的真实数据框中,我在数据框B 中有重复值。

编辑:我的数据示例

A = data.frame(cnumero=c("124,35", "375,NA", "NA,28"),cep = c(124, 375, NA), numero = c(35, NA, 28), bairro =  c("K", "L","M"))
B = data.frame(cnumero=c("124,35", "375,48", "135,28"), bairro =  c("J", "L","M"), XY = c(1, 2, 3))
new_A = data.frame(cnumero=c("124,35", "375,NA", "NA,28"),cep = c(124, 375, NA), numero = c(35, NA, 28), XY = c(1, 2, 3))

【问题讨论】:

  • 你确定A没问题吗? A$cnumero 中没有NA(请看is.na(A$cnumero)),所以我无法达到您的结果。你的意思是应该是字符串“NA”A$cnumero
  • A$numeroA$cep 是数字,但 A$cnumero 是字符串。
  • 确实是 NA,但是如果您使用 read.table 导入数据,它就会变成“NA”。如果@Ga13 与dput 共享数据会更容易。或者使用read.table时加na.strings = "NA"
  • 合并两次不是更方便吗?
  • 抱歉,搞糊涂了,重点是cnumero 中不能有NA。相关列是另外两列,NA默认识别正确

标签: r join inner-join


【解决方案1】:

以这种方式在基数 R 中的解决方案怎么样,做两个步骤,首先是第一个条件的连接,然后是第二个,最后将结果放在一起:

# the join with the first condition
A_1 <-  merge(A[!is.na(A$cep) & !grepl('NA',A$cnumero), ],B, by = 'cnumero')

# select the column you need
A_1 <- A_1[,c("cnumero", "cep","numero","XY")]

# join for the second condition
A_2 <-  merge(A[is.na(A$cep) | grepl('NA',A$cnumero), ],B, by = 'bairro')

# select columns you need
A_2 <- A_2[,c("cnumero.x", "cep","numero","XY")]

# rename the second part's columns
colnames(A_2) <- colnames(A_1)

# now the result 
new_A <- rbind(A_1,A_2)
new_A
  cnumero cep numero XY
1  124,35 124     35  1
2  375,NA 375     NA  2
3   NA,28  NA     28  3

# in case you need to remove the "temporary" tables
# remove(A_1, A_2)

【讨论】:

    猜你喜欢
    • 2017-12-23
    • 2018-02-02
    • 2020-08-16
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 2019-10-22
    • 2017-04-12
    • 2013-12-02
    相关资源
    最近更新 更多