以下是示例:
df1 <- data.frame(x=1:2, account=c(-1,-1))
df2 <- data.frame(x=1:3, account=c(1,-1,1))
df3 <- data.frame(x=1, account=c(-1))
ls <- list(df1,df2,df3)
尝试失败:
for(i in 1:length(ls)){
d <- ls[[i]]; if(d$account %in% c(-1,1)) { dout <- d} else {next}
}
我也尝试过:(不知道为什么这不起作用)
grepl(paste(c(-1,1), collapse="|"), as.character(df1$account))
给出:(这是正确的,因为|
表示或者,因此其中一个值匹配)
[1] TRUE TRUE
然而,我试过这个:
df1 <- data.frame(x=1:2, account=c(-1,1))
grepl(paste(c(-1,1), collapse="&"), as.character(df1$account))
给出:
[1] FALSE FALSE
我想只存储-1,1
列中包含account
值的数据帧子集,否则会忽略。
期望的结果:
d
x account
1 1 1
2 2 -1
3 3 1
答案 0 :(得分:3)
或者,您可以停止使用data.frames列表:
library(data.table)
DT <- rbindlist(ls, idcol="id")
# id x account
# 1: 1 1 -1
# 2: 1 2 -1
# 3: 2 1 1
# 4: 2 2 -1
# 5: 2 3 1
# 6: 3 1 -1
过滤单个表:
DT[, if (uniqueN(account) > 1) .SD, by=id]
# id x account
# 1: 2 1 1
# 2: 2 2 -1
# 3: 2 3 1
(这是@ akrun的回答; uniqueN(x)
是length(unique(x))
的快捷方式。)
答案 1 :(得分:1)
我们可以遍历list
并检查&{39}帐户中的length
元素是否unique
大于1(假设只有-1和1作为可能的元素)。使用此逻辑索引过滤list
。
ls[sapply(ls, function(x) length(unique(x$account))>1)]