函数内基于任何列中的值的子集数据

  • 本文关键字:子集 数据 于任何 函数 r
  • 更新时间 :
  • 英文 :


假设我想写一个这样的函数:

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

目的是删除行中的所有值(不是行号/索引/名称(,其中一个值等于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 Rdata.table的解决方案。

要删除行,您需要提供带有负号或向量的行索引(通常与nrow(df)长度相同(以及TRUEFALSE。您的代码!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

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

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

说明:您要做的是检查每个单元格的每个值,并将其引用回行号。使用base R,您的选择在这方面有点有限。一个明智的(即可维护的(解决方案可能是上面的东西,但我相信有人也会提出一个lapply或子集解决方案。

数据

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

最新更新