【问题标题】:Match two data frames in R considering two variables and not change the rows not matched考虑两个变量匹配 R 中的两个数据框,并且不更改不匹配的行
【发布时间】:2013-09-08 14:19:40
【问题描述】:

大家好,当两个数据帧有两个要匹配的公共变量时,我在匹配 R 中的两个数据帧时遇到了一点问题。第一个数据框是这样的:

Class  Count  V1  V2 V3
E       124   1   2   2
E       123   2   0   0
L       100   5   5   5
L       111   1   1   1
E       120   3   3   3

第二个数据框有这种形式:

Class  Count Code
E       124  1241
L       111  1234 

我想要一个新的数据框,考虑到匹配的 ClassCount 变量。生成的数据框将是这样的:

    Class  Count   V1    V2 V3
    E       124   1241   2   2
    E       123   2      0   0
    L       100   5      5   5
    L       111   1234   1   1
    E       120   3      3   3

只有匹配的元素在V1 变量中被替换为Code 变量。其余元素是相同的,我的第一个数据框中没有NA 和其他更改。我等待它可以在 R 中制作。在此先感谢。

【问题讨论】:

标签: r join dataframe


【解决方案1】:
 df1$V1<-ifelse((df1$Class==df2$Class & df1$Count==df2$Count),df2$Code,df1$V1)
     df1
  Class Count   V1 V2 V3
1     E   124 1241  2  2
2     E   123    2  0  0
3     L   100    5  5  5
4     L   111 1234  1  1
5     E   120    3  3  3

根据 cmets 提供的数据更新:

您可以在两个数据中使用interaction从c9和CC4创建一个交互变量(int),然后使用%in%(看起来您不是在寻找行到行匹配,所以您应该避免使用@987654324 @)。我建议您在使用 interaction 之前在 c9CC4 中处理 NA 。这是因为如果其中之一是 NA ,那么 int 的值将是 NA ,您可能不想匹配(在以下示例中,我还没有处理过NA)。

df1$int<-interaction(df1$c9,df1$CC4) #z data is df1 and z1 data is df2
df2$int<-interaction(df2$c9,df2$CC4)
df1[df1$int %in% df2$int,5]<-df2[df2$int %in% df1$int,13] #this will replaces col5 of df1 with col13 of df2 if matches occurs otherwise the value of col5 of df1 will be same as before

输出:

       > df1
         c1  c2 c9 CC4  A.la.vista Montoxv_a120d Montoxv_a15d Montoxv_a186d Montoxv_a30d Montoxv_a60d Montoxv_a7d Montoxv_a90d   int
1  20130830 192  E 111 39324363.19             0          0.0           0.0            0            0     1550000            0 E.111
2  20130830 192  E 124 71061061.04             0          0.0    69608583.8      1452477            0           0            0 E.124
3  20130830 192  E 131        0.00             0     182694.0           0.0      1027283      3308932     2010328      3809021 E.131
4  20130830 192  E 201 66310498.77             0          0.0           0.0            0            0           0            0 E.201
5  20130830 192  E 202        0.00      34403130   10275256.6    40375044.8     17999369     37156810     8953196     32639408 E.202
6  20130830 192  E 203 51885967.69             0          0.0           0.0            0            0           0            0 E.203
7  20130830 192  E 211  3537648.29             0          0.0           0.0            0            0           0            0 E.211
8  20130830 192  E  NA          NA       8181927     314120.5    10816365.6      3295626     11992733     3025800      4673335  <NA>
9  20130830 192  L 101    64013.84             0          0.0           0.0            0            0           0            0 L.101
10 20130830 192  L 111  5429375.87       5000000          0.0           0.0     11000000      8500000     7500000      9900000 L.111
11 20130830 192  L 121  8869286.40             0          0.0     7874386.4            0       994900           0            0 L.121
12 20130830 192  L 123  8805450.00       2200000          0.0     2005700.0      1299000      1300750           0      2000000 L.123
13 20130830 192  L 124  5408668.05             0          0.0     5408668.0            0            0           0            0 L.124
14 20130830 192  L 131        0.00             0    2539885.0           0.0            0      8498099      694912      3793809 L.131
15 20130830 192  L 141 18150400.00             0          0.0    15510400.0      1000000       150000           0      1490000 L.141
16 20130830 192  L 201  4545930.38             0          0.0           0.0            0            0           0            0 L.201
17 20130830 192  L 202        0.00             0          0.0      510609.7            0      1187226           0        95000 L.202
18 20130830 192  L 203   708863.95             0          0.0           0.0            0            0           0            0 L.203

要查看 df1 的哪一行匹配,请使用

> which(df1$int %in% df2$int)
[1]  2  6 11 12 13 15 18

【讨论】:

  • 它不适用于类似的数据框@Metrics 我收到了这样的消息Warning message: In z$c9 == z1$c9 : longer object length is not a multiple of shorter object length
  • 您可以忽略警告信息,只需在控制台中输入df1 即可查看输出。
  • @Duck:可以将 0 分配给不匹配的行(如果我正确理解了您的问题)df1[!(df1$int %in% df2$int),5]&lt;-0 应该可以工作。
  • df1[df1$int %in% df2$int,-c(1:5,13)]&lt;-0: 假设你不想删除前五列和最后一列
  • 糟糕:您是否只寻找匹配的?是否可以将输出仅匹配然后不匹配为 NA?如果你尝试df1[,5]&lt;-df2[match(df1$int,df2$int),13],那么 unmatched 将被分配 NA
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
相关资源
最近更新 更多