R lappy从列表中提取行

R lappy从列表中提取行,r,subset,lapply,R,Subset,Lapply,我有以下问题: 我有一个列表(L1),有两个部分,每个部分有4个相同的变量。 变量4也是列表部分的名称。e、 g.$a=a a <- data.frame(V1=c("a","b","c"), V2=c(4,7,9), V3=1:3, V4=c("a","a","a")) b <- data.frame(V1=c("d","e","f"), V2=c(10,14,16), V3=1:3, V4=c("b","b","b")) L1 <- list(a=a, b=b) L1 $

我有以下问题: 我有一个列表(L1),有两个部分,每个部分有4个相同的变量。 变量4也是列表部分的名称。e、 g.$a=a

a <- data.frame(V1=c("a","b","c"), V2=c(4,7,9), V3=1:3, V4=c("a","a","a"))
b <- data.frame(V1=c("d","e","f"), V2=c(10,14,16), V3=1:3, V4=c("b","b","b"))
L1 <- list(a=a, b=b)
L1

$a
V1    V2    V3   V4
a     4     1    a
b     7     2    a
c     9     3    a
$b
V1    V2    V3   V4
d     10     1    b
e     14     2    b
f     16     3    b
如果我选择一个值,例如V3==4,那么我的结果应该如下所示:

V1   V2    V3   V4
b    7     2    a
e    14    2    b
V1   V2    V3   V4
<NA>  <NA>  <NA>    a
<NA>  <NA>  <NA>    b
V1 V2 V3 V4
A.
B
我可以用
unlist(lappy(L1,“[”,3))
但我不知道如何提取变量中具有特定值的行。 我还尝试将lappy与子集函数结合起来,但这对我来说不起作用。
感谢您的帮助!

这应该可以。第一个命令返回一个列表,第二个命令将其转换为数据帧。如果该值不在数据中,则返回NA(对于列表)或一行NAs(对于df)


l您还可以使用dplyr绑定_行

list(a = a, b = b) %>%
  bind_rows(.id = "source") %>%
  filter(V2 == 2)

我们可以使用
data.table
创建函数。我们用
rbindlist
查找
列表
元素,按“V4”分组,
如果“V3”不等于给定值,我们返回NA元素(
.SD[.N+1]
),或者返回data.table的子集(
.SD[tmp]

库(data.table)

f1编写您自己的函数
foo
,它接受一个data.frame
df
和一个V3的值(我们称之为
v
)。因此编写
foo(df,v)
来返回您想要的内容。然后,只需将它应用到列表中:
lappy(L1,FUN=foo,3)
。注意这里的
3
是作为foo的第二个参数传递的。谢谢你的回答!这很好。再问一个问题:当找不到值时,我如何实现函数返回NA?我将把答案放在我的原始回答中谢谢你的帮助。你的解决方案解决了我的问题,我学到了很多b它!谢谢你的回答和帮助!我使用了托尔多的答案。但我也会尝试你的解决方案。谢谢!@Carlos没问题。很高兴帮助你。
list(a = a, b = b) %>%
  bind_rows(.id = "source") %>%
  filter(V2 == 2)
library(data.table)
f1 <- function(lst, val){
        rbindlist(lst)[, {tmp <- V3==val
                   if(!any(tmp)) .SD[.N+1]
                   else .SD[tmp]},
                           by = V4][, names(lst[[1]]), with=FALSE]
  }

f1(L1, 4)
#   V1 V2 V3 V4
#1: NA NA NA  a
#2: NA NA NA  b

f1(L1, 3)
#   V1 V2 V3 V4
#1:  c  9  3  a
#2:  f 16  3  b

f1(L1, 2)
#   V1 V2 V3 V4
#1:  b  7  2  a
#2:  e 14  2  b