2

大家好,当它们有两个要匹配的公共变量时,我在匹配 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

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

4

1 回答 1

0
 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

根据评论中提供的数据更新:

您可以在两个数据中使用 c9 和 CC4 创建一个交互变量(int)interaction,然后使用%in%(似乎您不是在寻找行到行匹配,所以您应该避免使用ifelse)。c9我建议您在使用 NA 时和CC4之前处理 NA interaction。这是因为如果其中之一是 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
于 2013-09-04T22:17:55.527 回答