子集存储在列表中的数据帧的行号具有与列表中存储的整数相同的值

时间:2019-01-25 10:06:20

标签: r

我还不太熟悉列表中存储的数据帧。

我有一个整数列表,这些整数基本上表示两个数据帧(df_nameA,df_nameB)的行的索引:

str(list1)
List of 2
$ df_nameA  :int [1:3] 3 4 6
$ df_nameB  :int [1:3] 1 2 4

df_nameA
nrow  col1.  col 3
 1.    a.    A1
 2.    b.    A2
 3     c     B1
 4.    d     B2
 5.    e     C1
 6.    f     C2
df_nameB
nrow  col1.  col 3
 1.    g     D1
 2.    h     D2
 3     i     E1
 4.    l     E2
 5.    m     F1
 6.    n     F2
list2<-list(df_nameA, df_nameB)
str(list2)
List of 2  :  6 observation and 3 variables
  $:'dataframe'....

所需的输出:

df_nameA
nrow  col1.  col 3 
 3     c     B1
 4.    d     B2
 6.    f     C2
df_nameB
nrow  col1.  col 3
 1.    g     D1
 2.    h     D2
 4.    l     E2

基本上,我想基于列表1中存储的值对list2中的数据帧进行子集化。

我写了这样的东西,但似乎不起作用:

for(i in seq_along(list1)){
  for(i in seq_along(list2)){
    lapply(list2, function(x) {return(x[x$nrow %in% list1[[i]],])})
  }}

该代码似乎在两个数据帧的第1,2,4行中设置子集 关于我的代码有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您可以按以下方式使用lapply或如下的for循环

施加

names(list2) <- c("df_nameA", "df_nameB")
lapply(names(list2), function(x) list2[[x]][list2[[x]]$nrow %in% list1[[x]], ])

# [[1]]
#   nrow col1. col.3
# 3    3     c    B1
# 4    4     d    B2
# 6    6     f    C2
# 
# [[2]]
#   nrow col1. col.3
# 1    1     g    D1
# 2    2     h    D2
# 4    4     l    E2

循环

names(list2) <- c("df_nameA", "df_nameB")
for (x in names(list2)) {
  list2[[x]] <- list2[[x]][list2[[x]]$nrow %in% list1[[x]], ]
}

list2

# $`df_nameA`
#   nrow col1. col.3
# 3    3     c    B1
# 4    4     d    B2
# 6    6     f    C2
# 
# $df_nameB
#   nrow col1. col.3
# 1    1     g    D1
# 2    2     h    D2
# 4    4     l    E2

数据
可复制格式的数据:

list1 <- list(df_nameA = c(3, 4, 6), 
              df_nameB = c(1, 2, 4))

list2 <- list(data.frame(nrow = c(1, 2, 3, 4, 5, 6), 
                         col1. = c("a.", "b.", "c", "d", "e", "f"), 
                         col.3 = c("A1", "A2", "B1", "B2", "C1", "C2")), 
              data.frame(nrow = c(1, 2, 3, 4, 5, 6), 
                         col1. = c("g", "h", "i", "l", "m", "n"), 
                         col.3 = c("D1", "D2", "E1", "E2", "F1", "F2")))

答案 1 :(得分:1)

您正在第二个循环中覆盖i: 这可能有效:

for(i in seq_along(list1)){
  list2[[i]][ list2[[i]]$nrow %in% list1[[i]],]
}