Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于另一个数据帧比较两行_R - Fatal编程技术网

R 基于另一个数据帧比较两行

R 基于另一个数据帧比较两行,r,R,让我们从主数据集开始: > dput(tbl_test1) structure(list(X1 = structure(c(17L, 14L, 20L, 16L, 1L, 2L, 3L, 4L, 15L, 8L, 9L, 10L, 11L, 12L, 13L, 21L, 22L, 23L, 18L, 19L, 5L, 6L, 7L), .Label = c("Astra_1", "Astra_2", "Astra_3", "Astra_4", "Audi_1", "Audi_2",

让我们从主数据集开始:

> dput(tbl_test1)
structure(list(X1 = structure(c(17L, 14L, 20L, 16L, 1L, 2L, 3L, 
4L, 15L, 8L, 9L, 10L, 11L, 12L, 13L, 21L, 22L, 23L, 18L, 19L, 
5L, 6L, 7L), .Label = c("Astra_1", "Astra_2", "Astra_3", "Astra_4", 
"Audi_1", "Audi_2", "Audi_3", "BMW_1", "BMW_2", "BMW_3", "BMW_4", 
"BMW_5", "Fiat_1", "Mazda_2", "Mercedes_1", "Nexia_1", "Porsche_1", 
"Scania_1", "Scania_2", "Tico_1", "VW_1", "VW_2", "VW_3"), class = "factor"), 
    X2 = structure(c(2L, 3L, 10L, 7L, 8L, 12L, 9L, 14L, 11L, 
    4L, 5L, 6L, 15L, 13L, 4L, 5L, 9L, 14L, 11L, 1L, 3L, 10L, 
    16L), .Label = c("Astra_1", "Astra_3", "Astra_4", "Audi_1", 
    "Audi_2", "Audi_3", "BMW_1", "BMW_2", "Mazda_2", "Mercedes_1", 
    "Nexia_1", "Porsche_1", "Scania_2", "Tico_1", "VW_2", "VW_3"
    ), class = "factor"), AUC_1 = c(5860133.702, 1296009.939, 
    333123.4932, 250348.9407, 1376193.334, 4080502.863, 3777603.233, 
    3503973.487, 99101538.62, 231873.8462, 87258.75465, 147430.9913, 
    1028986.892, 1451482.832, 8136.72382, 25311.41683, 131352.7137, 
    565410.8186, 30196.23792, 70184.82268, 2526321.019, 381643.2138, 
    819687.9824), AUC_2 = c(4849720.322, 928980.4715, 320547.6185, 
    223287.2029, 1340641.323, 4720329.699, 4369150.434, 3371021.243, 
    108591253.3, 266489.7601, 85384.84604, 165726.7626, 1052130.559, 
    1470876.65, 9499.927679, 49309.74984, 138482.765, 444600.7911, 
    25132.73714, 55453.67019, 2038911.81, 422559.3293, 1445477.433
    ), ratio = c(1.20834467, 1.395088463, 1.03923247, 1.121196994, 
    1.02651866, 0.864452935, 0.864608186, 1.039439753, 0.91261069, 
    0.87010415, 1.021946618, 0.889602795, 0.978003046, 0.98681479, 
    0.856503765, 0.513314647, 0.948513078, 1.271726974, 1.201470327, 
    1.265647926, 1.2390536, 0.90317072, 0.567070757), Country = structure(c(1L, 
    1L, 2L, 4L, 6L, 6L, 6L, 6L, 5L, 8L, 8L, 8L, 8L, 8L, 7L, 7L, 
    7L, 7L, 9L, 9L, 3L, 3L, 3L), .Label = c("France", "Germany", 
    "Ireland", "Italy", "Norway", "Poland", "Spain", "Sweden", 
    "Ukraine"), class = "factor")), .Names = c("X1", "X2", "AUC_1", 
"AUC_2", "ratio", "Country"), class = "data.frame", row.names = c(NA, 
-23L))
我想通过查看另一张表来比较前两列中的汽车。为了更详细地解释,让我下表:

> dput(tbl_test2)
structure(list(X = structure(c(17L, 14L, 20L, 16L, 1L, 2L, 3L, 
8L, 9L, 10L, 11L, 12L, 4L, 15L, 13L, 21L, 22L, 23L, 18L, 19L, 
5L, 6L, 7L), .Label = c("Astra_1", "Astra_2", "Astra_3", "Astra_4", 
"Audi_1", "Audi_2", "Audi_3", "BMW_1", "BMW_2", "BMW_3", "BMW_4", 
"BMW_5", "Fiat_1", "Mazda_2", "Mercedes_1", "Nexia_1", "Porsche_1", 
"Scania_1", "Scania_2", "Tico_1", "VW_1", "VW_2", "VW_3"), class = "factor"), 
    X10 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), X34 = c(0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 1L, 0L, 1L), X59 = c(0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    1L, 1L), X84 = c(0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 
    1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L), X110 = c(0L, 
    0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 1L, 0L), X134 = c(0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L), X165 = c(1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
    X199 = c(1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), X234 = c(1L, 
    0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 
    0L, 1L, 0L, 0L, 0L, 0L, 0L), X257 = c(1L, 0L, 0L, 0L, 1L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 
    0L, 0L, 0L), X362 = c(0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L), 
    X433 = c(0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L), X506 = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
    1L, 1L, 1L, 0L, 0L, 0L, 0L), X581 = c(0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 
    0L, 0L, 0L), X652 = c(0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 
    0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L), 
    X733 = c(0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 1L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), X818 = c(0L, 
    0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 
    0L, 0L, 0L, 1L, 0L, 0L, 0L), X896 = c(0L, 0L, 0L, 0L, 0L, 
    1L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
    0L, 0L, 0L), X972 = c(0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 
    0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L), 
    X1039 = c(0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 
    1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L)), .Names = c("X", 
"X10", "X34", "X59", "X84", "X110", "X134", "X165", "X199", "X234", 
"X257", "X362", "X433", "X506", "X581", "X652", "X733", "X818", 
"X896", "X972", "X1039"), class = "data.frame", row.names = c(NA, 
-23L))
上表在第一列中存储了来自上一数据集的车辆,在下一列中我们有两个数字:
0
1
。 我想在第一列数据中添加一个新的列,以指示第一列中的车辆(例如
Porsche_1
(全名很重要。我的意思是
)和第二列中的车辆
Astra_3
是否在数据集2的同一列中有数字1。这是不正确的,所以我们在这个附加列中添加了0或NA。如果两者都将数字1放在同一列中,如
Porsche_1
Astra_1
,则数字1应放在附加列中

期望输出:最后一列的数字是随机生成的

           X1         X2        AUC_1        AUC_2     ratio Country Comp
1   Porsche_1    Astra_3  5860133.702 4.849720e+06 1.2083447  France  0
2     Mazda_2    Astra_4  1296009.939 9.289805e+05 1.3950885  France  1
3      Tico_1 Mercedes_1   333123.493 3.205476e+05 1.0392325 Germany  1
4     Nexia_1      BMW_1   250348.941 2.232872e+05 1.1211970   Italy  0
5     Astra_1      BMW_2  1376193.334 1.340641e+06 1.0265187  Poland  0
6     Astra_2  Porsche_1  4080502.863 4.720330e+06 0.8644529  Poland  1
7     Astra_3    Mazda_2  3777603.233 4.369150e+06 0.8646082  Poland  0
8     Astra_4     Tico_1  3503973.487 3.371021e+06 1.0394398  Poland  1
9  Mercedes_1    Nexia_1 99101538.620 1.085913e+08 0.9126107  Norway  1
10      BMW_1     Audi_1   231873.846 2.664898e+05 0.8701041  Sweden  0

实现这一点的一种方法是使用
mapply
,检查
tbl_test2
行中第一个车名在X中的
1
是否也在X中包含第二个车名的行中(也就是说,检查
any
列中是否有
TRUE&TRUE
),对于每一对,您将获得
TRUE
FALSE
,然后可以使用
as.integer将其转换为
0/1

tbl_test1$Comp <- mapply(function(x, y) as.integer(any(unlist(tbl_test2[tbl_test2$X==x, -1]) & unlist(tbl_test2[tbl_test2$X==y, -1]))), 
                         x=as.character(tbl_test1$X1), 
                         y=as.character(tbl_test1$X2))

head(tbl_test1)
#           X1         X2        AUC_1        AUC_2     ratio Country Comp
#1   Porsche_1    Astra_3  5860133.702 4.849720e+06 1.2083447  France    0
#2     Mazda_2    Astra_4  1296009.939 9.289805e+05 1.3950885  France    0
#3      Tico_1 Mercedes_1   333123.493 3.205476e+05 1.0392325 Germany    1
#4     Nexia_1      BMW_1   250348.941 2.232872e+05 1.1211970   Italy    0
#5     Astra_1      BMW_2  1376193.334 1.340641e+06 1.0265187  Poland    0
#6     Astra_2  Porsche_1  4080502.863 4.720330e+06 0.8644529  Poland    0

使用
dplyr
,您可以按每行计算第二个data.frame中与
X1
X2
中的名称对应的行中匹配的
1
,然后查找是否至少有一个匹配:

library(dplyr)
tbl_test1 %>% rowwise() %>% 
  mutate(nmatch = sum(which(tbl_test2[grep(X1, tbl_test2$X),]==1) 
                      %in% which(tbl_test2[grep(X2, tbl_test2$X),]==1)),
         Comp = as.integer(nmatch!=0))

#            X1         X2      AUC_1       AUC_2     ratio Country nmatch  Comp
#        (fctr)     (fctr)      (dbl)       (dbl)     (dbl)  (fctr)  (int) (int)
# 1   Porsche_1    Astra_3  5860133.7   4849720.3 1.2083447  France      0     0
# 2     Mazda_2    Astra_4  1296009.9    928980.5 1.3950885  France      0     0
# 3      Tico_1 Mercedes_1   333123.5    320547.6 1.0392325 Germany      2     1
# 4     Nexia_1      BMW_1   250348.9    223287.2 1.1211970   Italy      0     0
# 5     Astra_1      BMW_2  1376193.3   1340641.3 1.0265187  Poland      0     0
# 6     Astra_2  Porsche_1  4080502.9   4720329.7 0.8644529  Poland      0     0
# 7     Astra_3    Mazda_2  3777603.2   4369150.4 0.8646082  Poland      0     0
# 8     Astra_4     Tico_1  3503973.5   3371021.2 1.0394398  Poland      0     0
# 9  Mercedes_1    Nexia_1 99101538.6 108591253.3 0.9126107  Norway      1     1
# 10      BMW_1     Audi_1   231873.8    266489.8 0.8701041  Sweden      0     0
# ..        ...        ...        ...         ...       ...     ...    ...   ...

注意:
nmatch
列只是一种奖励,您可以在步骤中完成所有操作,当然只需获得
Comp

是否可以将它们共享的列号替换为数字
1
,您可以用
替换
任何
,然后使用
粘贴
collapse=“,”
创建一个唯一的字符串。当nomatchGreat时,您将获得
“”
。非常感谢。这就是我要找的。
library(dplyr)
tbl_test1 %>% rowwise() %>% 
  mutate(nmatch = sum(which(tbl_test2[grep(X1, tbl_test2$X),]==1) 
                      %in% which(tbl_test2[grep(X2, tbl_test2$X),]==1)),
         Comp = as.integer(nmatch!=0))

#            X1         X2      AUC_1       AUC_2     ratio Country nmatch  Comp
#        (fctr)     (fctr)      (dbl)       (dbl)     (dbl)  (fctr)  (int) (int)
# 1   Porsche_1    Astra_3  5860133.7   4849720.3 1.2083447  France      0     0
# 2     Mazda_2    Astra_4  1296009.9    928980.5 1.3950885  France      0     0
# 3      Tico_1 Mercedes_1   333123.5    320547.6 1.0392325 Germany      2     1
# 4     Nexia_1      BMW_1   250348.9    223287.2 1.1211970   Italy      0     0
# 5     Astra_1      BMW_2  1376193.3   1340641.3 1.0265187  Poland      0     0
# 6     Astra_2  Porsche_1  4080502.9   4720329.7 0.8644529  Poland      0     0
# 7     Astra_3    Mazda_2  3777603.2   4369150.4 0.8646082  Poland      0     0
# 8     Astra_4     Tico_1  3503973.5   3371021.2 1.0394398  Poland      0     0
# 9  Mercedes_1    Nexia_1 99101538.6 108591253.3 0.9126107  Norway      1     1
# 10      BMW_1     Audi_1   231873.8    266489.8 0.8701041  Sweden      0     0
# ..        ...        ...        ...         ...       ...     ...    ...   ...