假设我想写一个这样的函数:
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 R
或data.table
的解决方案。
要删除行,您需要提供带有负号或向量的行索引(通常与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
为什么不是一个简单的循环?
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"))