R lappy从列表中提取行
我有以下问题: 我有一个列表(L1),有两个部分,每个部分有4个相同的变量。 变量4也是列表部分的名称。e、 g.$a=aR 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 $
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.framedf
和一个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