我是R的新手,我有一个问题,就是根据另一个列表中的行名来匹配一个列表中的数据帧列。例如:
list1 = list(mtcars[1:10,],mtcars[11:20,])
list2 = list(mtcars[1:10,1:4],mtcars[11:20,1:4])
我希望根据drat
和list2
的常见行名称将列list1
与list2
匹配。我做了类似的事情:
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
有人可以帮忙吗?谢谢!
答案 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
列。