如果两个值都存在,请选择数据框

时间:2015-10-05 18:26:38

标签: r

以下是示例:

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

2 个答案:

答案 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)]