大家好,我有一个问题是匹配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
我希望有一个新的数据框,考虑匹配的Class
和Count
变量。结果数据框将如下所示:
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中制作。先谢谢。
答案 0 :(得分: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
根据评论中提供的数据进行了更新:
您可以在两个数据中使用interaction
从c9和CC4创建交互变量(int),然后使用%in%
(似乎您不是在寻找行到行匹配,所以你应该避免使用ifelse
)。我建议您在使用c9
之前在CC4
和interaction
处理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