比方说,我想编写一个像这样的函数:
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
解决方案。
答案 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"))