【问题标题】:Making a match between two variables from different data frames and showing others variables from both data frames在来自不同数据帧的两个变量之间进行匹配并显示来自两个数据帧的其他变量
【发布时间】:2013-07-13 22:46:06
【问题描述】:

我对像这样的两个数据框有一点问题:拳头数据框

     Num.Op     Bonus
    381942        Y
    382181        Z
    382260        A
    382266        A

第二个数据框:

    Num.Op1     Site
    381942  Ecua Auto S.A.
    382181  Vallejo Araujo S.A.
    382260  Automotores de la Sierra
    382266  Automotores de la Sierra
    382310  Vallejo Araujo S.A.
    382619  Vallejo Araujo S.A.

我想创建一个新的数据框,在比较第一个数据框的变量Num.Op 和第二个数据框的变量Num.Op1 之后,我显示了两个变量:第一个是Num.Op1从第二个数据帧开始,第二个是v1,如果Num.Op 中的元素在Num.Op1 中,则v1 的值为1,如果不在,则为0,对于所有具有1 的情况,变量@应显示 987654330@ 和 bonus。像这样的:

   Num.Op1   v1  Site                        Bonus
    381942    1  Ecua Auto S.A.                Y
    382181    1  Vallejo Araujo S.A.           Z
    382260    1  Automotores de la Sierra      A
    382266    1  Automotores de la Sierra      A
    382310    0  NA                            NA
    382619    0  NA                            NA

我用匹配证明,但我没有得到结果。

【问题讨论】:

  • merge with all.y=TRUE
  • 我们也不能轻易地读取这些数据。请使用 dput 提供数据。

标签: r


【解决方案1】:
# input data
df1 = read.table(text = ' Num.Op     Bonus
 381942        Y
 382181        Z
 382260        A
 382266        A', header = T)
df2 = read.table(text = '    Num.Op1     Site
    381942  "Ecua Auto S.A."
    382181  "Vallejo Araujo S.A."
    382260  "Automotores de la Sierra"
    382266  "Automotores de la Sierra"
    382310  "Vallejo Araujo S.A."
    382619  "Vallejo Araujo S.A."', header = T)

# load data.table, convert to data.table and set keys for merging
library(data.table)
dt1 = data.table(df1, key = "Num.Op")
dt2 = data.table(df2, key = "Num.Op1")

# the merge - add a v1 column to dt1, merge with dt2, whenever the merge fails,
# i.e. v1 is NA, set v1 to 0 and Site to NA (Bonus will be set to NA automatically)
result = dt1[, v1 := 1][dt2][is.na(v1), `:=`(v1 = 0, Site = NA_character_)]
result
#   Num.Op Bonus v1                     Site
#1: 381942     Y  1           Ecua Auto S.A.
#2: 382181     Z  1      Vallejo Araujo S.A.
#3: 382260     A  1 Automotores de la Sierra
#4: 382266     A  1 Automotores de la Sierra
#5: 382310    NA  0                       NA
#6: 382619    NA  0                       NA

【讨论】:

    【解决方案2】:

    您想使用merge 函数。

    首先,为您的第一个数据框创建一个新列“v1”并用“1”填充它:

    df1$v1 <- 1
    

    然后通过将 2 个原始数据框合并在一起来创建一个新的 data.frame:

    mergedDF <- merge(df1, df2, by=1, all.y=TRUE)
    

    最后,将“0”分配给 v1 列中尚未为“1”的值:

    mergedDF$v1[is.na(mergedDF$v1)] <- 0
    

    mergedDF 现在应该包含您想要的内容。

    【讨论】:

      猜你喜欢
      • 2014-05-12
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      相关资源
      最近更新 更多