【问题标题】:How to compare two columns from different data frames that have different number of rows considering another variable考虑到另一个变量,如何比较具有不同行数的不同数据帧的两列
【发布时间】:2018-02-07 21:25:24
【问题描述】:

我试图分别比较来自不同 csv 文件的两列。

但我不知道该怎么做,因为这些数据框有不同的行数。另外,我想比较一下匹配另一个变量的那些。

例如,

>dat1
ID    X   Y    CODE 
1111  1   4    A
1111  2   3    A
1111  2   2    A
1112  2   2    A
1112  1   3    A
1112  2   5    A
1121  1   3    B
1121  2   1    B
1121  3   2    B

>dat2
ID    as   df    CODE 
1111   g    a    A
1112   d    d    A
1121   g    b    B

假设我有这两个数据集,我想比较列 CODEdat1dat2 是否它们与 ID 具有相同的值。

我的期望如下

>dat2
ID    as   df    CODE  Error
1111   g    a    A     0
1112   d    d    A     0
1121   g    b    B     0

如果发生任何不匹配,dat2$Error 编码为 1。这是我的期望,如果我知道哪个值不匹配会更好。

【问题讨论】:

  • 请添加您的预期输出。
  • 我添加了一个补充说明。谢谢。
  • 你可以试试match,即dat2$Error <- with(dat2, as.integer(!paste(ID, CODE) %in% paste(dat1$ID, dat1$CODE)))
  • @akrun 谢谢!但它表明“dat2$Error”全是“1”。是否如我预期的那样正常工作?
  • 根据数据,我得到全0

标签: r


【解决方案1】:

我认为这就是你想要做的:

library(dplyr)
dat1unique <- dat1 %>% select(ID, CODE) %>% distinct() %>% 
    rename(CODE1 = CODE)
dat2 <- dat2 %>% rename(CODE2 = CODE)
dat3 <- right_join(dat1unique, dat2, by = "ID") %>% 
    mutate(Error = ifelse(CODE1 == CODE2, 0, 1))

> dat3
    ID CODE1 as df CODE2 Error
1 1111     A  g  a     A     0
2 1112     A  d  d     A     0
3 1121     B  g  b     B     0

【讨论】:

    【解决方案2】:

    if_else((!paste(dat2$ID, dat2$CODE) %in% paste(dat1$ID, dat1$CODE),0,1)

    【讨论】:

    • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    相关资源
    最近更新 更多