如何将列表从一个列表匹配到另一个列表?

时间:2018-02-20 00:14:12

标签: r list match

我是R的新手,我有一个问题,就是根据另一个列表中的行名来匹配一个列表中的数据帧列。例如:

list1 = list(mtcars[1:10,],mtcars[11:20,])
list2 = list(mtcars[1:10,1:4],mtcars[11:20,1:4])

我希望根据dratlist2的常见行名称将列list1list2匹配。我做了类似的事情:

drat = lapply(list1, function(x) setNames(x$drat, rownames(x)))
lapply(list2, function(x) {x$drat = drat[as.character(rownames(x))]; x})

但它没有用,返回

[[1]]
                   mpg cyl  disp  hp drat
Mazda RX4         21.0   6 160.0 110 NULL
Mazda RX4 Wag     21.0   6 160.0 110 NULL
Datsun 710        22.8   4 108.0  93 NULL
Hornet 4 Drive    21.4   6 258.0 110 NULL
Hornet Sportabout 18.7   8 360.0 175 NULL
Valiant           18.1   6 225.0 105 NULL

[[2]]
                     mpg cyl  disp  hp drat
Merc 280C           17.8   6 167.6 123 NULL
Merc 450SE          16.4   8 275.8 180 NULL
Merc 450SL          17.3   8 275.8 180 NULL
Merc 450SLC         15.2   8 275.8 180 NULL
Cadillac Fleetwood  10.4   8 472.0 205 NULL
Lincoln Continental 10.4   8 460.0 215 NULL

有人可以帮忙吗?谢谢!

1 个答案:

答案 0 :(得分:4)

这是一个基础R方法:

mapply(merge, lapply(list1, `[`, "drat"), list2,
       MoreArgs = list(by = "row.names"),
       SIMPLIFY = FALSE)
# [[1]]
#            Row.names drat  mpg cyl  disp  hp
# 1         Datsun 710 3.85 22.8   4 108.0  93
# 2         Duster 360 3.21 14.3   8 360.0 245
# 3     Hornet 4 Drive 3.08 21.4   6 258.0 110
# 4  Hornet Sportabout 3.15 18.7   8 360.0 175
# 5          Mazda RX4 3.90 21.0   6 160.0 110
# 6      Mazda RX4 Wag 3.90 21.0   6 160.0 110
# 7           Merc 230 3.92 22.8   4 140.8  95
# 8          Merc 240D 3.69 24.4   4 146.7  62
# 9           Merc 280 3.92 19.2   6 167.6 123
# 10           Valiant 2.76 18.1   6 225.0 105
# 
# [[2]]
#              Row.names drat  mpg cyl  disp  hp
# 1   Cadillac Fleetwood 2.93 10.4   8 472.0 205
# 2    Chrysler Imperial 3.23 14.7   8 440.0 230
# 3             Fiat 128 4.08 32.4   4  78.7  66
# 4          Honda Civic 4.93 30.4   4  75.7  52
# 5  Lincoln Continental 3.00 10.4   8 460.0 215
# 6            Merc 280C 3.92 17.8   6 167.6 123
# 7           Merc 450SE 3.07 16.4   8 275.8 180
# 8           Merc 450SL 3.07 17.3   8 275.8 180
# 9          Merc 450SLC 3.07 15.2   8 275.8 180
# 10      Toyota Corolla 4.22 33.9   4  71.1  65

我在maple上使用list2元素,在每个drat元素中使用list1列。 mapply应用的函数为merge,我指定按行名称执行此操作,并禁止通过将SIMPLIFY设置为FALSE将结果转换为数组。副作用是结果数据框包含Row.names列。