在不同数据帧的两个变量之间进行匹配,并在两个数据帧中显示其他变量

时间:2013-07-15 22:22:43

标签: r

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

     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.

我想创建一个新的数据框,在对数据帧1的变量Num.Op和第二个数据帧的变量Num.Op1进行比较之后,我展示了两个变量:来自第二个数据框的Num.Op1v1v1如果Num.Op中的元素位于Num.Op1,则site将取0,如果isn,则{0}并且,对于所有具有1的情况,还应显示变量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 。像这样:

{{1}}

我用比赛证明但是我得不到结果。

2 个答案:

答案 0 :(得分:0)

# 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

答案 1 :(得分:0)

您想使用merge功能。

首先,为您的第一个数据框创建一个新列'v1'并填入'1':

df1$v1 <- 1

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

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

最后,为v1列中尚未为'1'的值指定'0':

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

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