【问题标题】:Excluding rows containting consecutive zeros from data frame从数据框中排除包含连续零的行
【发布时间】:2016-04-12 08:35:45
【问题描述】:

我想从我的数据框中排除至少有 2 个连续零的行。示例:

subj    stimulus    var1   var2   var3   var4   
 1         A         25     30     15     36
 1         B          0      0     10      0
 1         C         12      0     20     23

我想排除包含两个零的刺激 B 的试验,但保留 C 的值仅包含一个。 到目前为止,我已经尝试过:

has3Zeros <- function(x) {
  x <- x[!is.na(x)] == 0 
  if (length(x) < 3) {
    FALSE 
  }
}
df[,!sapply(df, has3Zeros), drop=F]

但它告诉我这是一个无效的参数类型。是否有一种“简单”的方法来完成排除具有连续零的行?

提前谢谢你。

【问题讨论】:

  • 尽管我事先扫描了网络,但我现在使用了正确的关键字并在这里发现了同样的问题:stackoverflow.com/questions/11797216/… 在我的情况下,答案是:df[rowSums(df==0)&lt;=2,]
  • 不考虑是否为consecutive

标签: r


【解决方案1】:

如果我们在每一行中查找任何连续的零并希望排除该行,一种方法是使用applyMARGIN=1 循环遍历这些行。检查相邻元素中是否有any 相等且为零,取反,取行。

df1[!apply(df1[-(1:2)], 1, FUN = function(x) any((c(FALSE, x[-1]==x[-length(x)])) & !x)),]
#  subj stimulus var1 var2 var3 var4
#1    1        A   25   30   15   36
#3    1        C   12    0   20   23

或者如果我们需要连续的零长度为'n',则可以将rle应用于每一行,检查'values'为0的lengths是否为'n',否定和子集行.

df1[!apply(df1[-(1:2)], 1, FUN = function(x) any(with(rle(x==0), lengths[values])==2)),]
#  subj stimulus var1 var2 var3 var4
#1    1        A   25   30   15   36
#3    1        C   12    0   20   23

【讨论】:

    猜你喜欢
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 2015-06-14
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多