基于任何列[R]中的值对函数内的子集数据进行分组

时间:2018-10-23 21:55:40

标签: r

比方说,我想编写一个像这样的函数:

SomeClassTest::Tests()

目的是删除其中一个值等于to_remove中指定的值的行中的所有值(而不是行号/索引/名称)。

有没有主意为什么不指定列就无法运行?

示例:

Fn <- function(df, to_remove = NULL) {
  df <- df[!df %in% to_remove,]
}

预期输出:

df <- data.frame(a = c("a", "a", "a"), b = c("a", "b", "a"))

  a b
1 a a
2 a b
3 a a

我正在寻找一种 a b 1 a a 3 a a base R解决方案。

2 个答案:

答案 0 :(得分:1)

要删除行,您需要使用nrow(df)TRUE为行索引提供负号或向量(通常与FALSE相同)。您的代码!df %in% to_remove不能这样做。试试这个-

Fn <- function(df, to_remove = NULL) {
  df[!apply(df, 1, function(x) any(x %in% to_remove)), ]
}

Fn(df, "b")
  a b
1 a a
3 a a

Fn(df, c("a", "b"))
[1] a b
<0 rows> (or 0-length row.names)

Fn(df, "d")
  a b
1 a a
2 a b
3 a a

答案 1 :(得分:1)

为什么不做一个简单的循环?

rowrem <- function(x, val) {
    for(i in 1:nrow(x)){
        for(j in 1:ncol(x)){
            if(paste(x[i,j]) == val)(
                x <- x[-i,]                
            )
        }
    }
    print(x)
}
结果
> rowrem(df1, "b")
  a b
1 a a
3 a a

说明:您要做的是检查每个单元格的每个单个值,然后将其返回给行号。在使用R的情况下,您的选择在这方面受到限制。明智的(即可维护的)解决方案可能与上述类似,但是我敢肯定有人也会提出lapply或子集解决方案。

数据

df1 <- data.frame(a = c("a", "a", "a"), b = c("a", "b", "a"))