使用行位置向量列表在数据帧列表中设置子行

时间:2018-03-22 12:35:00

标签: r list subset lapply

我有一个数据框列表:

data1 <-
data.frame(
    ID = c(1, 1, 1, 1),
    Name1 = c(3, 2, 3, 2),
    Name2 = c(4, 5, 4, 5),
    Name3 = c(6, 7, 6, 7),
    Name4 = c(8, 9, 8, 9))
data2 <-
data.frame(
    ID = c(2, 2, 2),
    Name4 = c(7, 3, 3),
    Name2 = c(3, 1, 1),
    Name3 = c(2, 2, 2),
    Name1 = c(1, 1, 1))
data3 <-
data.frame(
    ID = c(3, 3, 3, 3, 3, 3),
    Name3 = c(6, 6, 6, 6, 6, 6),
    Name1 = c(2, 2, 2, 2, 2, 2),
    Name4 = c(3, 3, 3, 3, 3, 3),
    Name2 = c(2, 2, 2, 2, 2, 2))
data4 <-
data.frame(
    ID = c(4, 4, 4, 4),
    Name2 = c(5, 7, 7, 5),
    Name3 = c(1, 1, 1, 1),
    Name1 = c(9, 1, 9, 1),
    Name4 = c(3, 3, 3, 3))

list_data <- list(data1, data2, data3, data4)

我还有一个列表,其中包含相同数量的条目,每个条目包含list_data中行位置的向量:

rows1 <- c(1, 4)
rows2 <- c(1)
rows3 <- c(1, 3, 6)
rows4 <- c(2, 3)

list_rows <- list(rows1, rows2, rows3, rows4)

如何使用list_data中相应的行位置向量对list_rows中的每个数据框进行子集?

2 个答案:

答案 0 :(得分:3)

对于相应的索引,base R方向选项为Map

Map(function(x, y) x[y, ], list_data, list_rows) 
#[[1]]
#  ID Name1 Name2 Name3 Name4
#1  1     3     4     6     8
#4  1     2     5     7     9

#[[2]]
#  ID Name4 Name2 Name3 Name1
#1  2     7     3     2     1

#[[3]]
#  ID Name3 Name1 Name4 Name2
#1  3     6     2     3     2
#3  3     6     2     3     2
#6  3     6     2     3     2

#[[4]]
#  ID Name2 Name3 Name1 Name4
#2  4     7     1     1     3
#3  4     7     1     9     3

可以使用map2

中的purrr进行类似的提取
library(tidyverse)
map2(list_data, list_rows, ~ .x[.y,])   

或者

map2(list_data, list_rows,  `[`, )   

答案 1 :(得分:1)

这是使用lapply的可能解决方案:

NSPersistentContainer