【问题标题】:How to delete all rows with a specific value如何删除具有特定值的所有行
【发布时间】:2024-03-09 12:45:02
【问题描述】:

这可能很简单,但我已经查看了该站点上的答案,但没有找到解决方案。我有一个数据框,我想删除所有等于 1 的观察值。在我原来的 df 中有超过 90 列。

我已尝试使用 lapply 函数和过滤,但我无法使其工作:

df <- data.frame(x1 = c('0','1', '0', '1', '1'),
                 x2 = c('1','0', '1', '1', '0'),
                 x3 = c('1','0', '1', '1', '1'))

df[] <- lapply(df, function(x) subset(df, x==0 ))
df<- as.data.frame(lapply(df, function(x) subset(df, x==0 )))
df[] <- lapply(df, function(x) df[!(df$x ==1),])

library(dplyr)
df %>% filter(!all(df == 1))
df<-df[!(df ==1),]

我的预期输出是

 x2 x3
0   0       

【问题讨论】:

  • 如果有缺失值会发生什么,例如一行是c(1, 1, NA, 1)?
  • 好问题。我还没有检查 NA 的数据,但这可能是一种可能性。如果可能的话,我想保留 NA 值,因为目的是为了测试
  • 您的预期输出实际上应该是什么样子?
  • 谢谢@jay.sf,我在问题中添加了预期的输出
  • 你能解释一下如何得到预期的输出吗?这两个零是什么?

标签: r dataframe conditional-statements filtering subset


【解决方案1】:

如果你使用data.table

DT<-as.data.table(df)
ans<-DT[,lapply(.SD, function(x){subset(x,x!="1")})]
ans

【讨论】:

  • 感谢您的解决方案!它在我为此目的创建的小 df 上运行良好,但是当我在原始 df 上尝试时,我得到了这个错误;项目 2 有 199987 行,但最长的项目有 200000;与剩余部分一起回收。第 3 项有 183095 行,但最长的项目有 200000 行;与剩余部分一起回收。第 4 项有 51291 行,但最长的项目有 200000 行;等等 。你以前见过吗?我的所有变量都是 chr,如本例所示,如果它们是数字,我会得到相同的错误
  • 您确定这不是警告吗?当我使用上面DT[,lapply(.SD, function(x){subset(x,x=="1")})] 的反向过滤器示例时,我会收到类似的警告。在这种情况下,x1 和 x2 分别有三行 x== "1",而 x3 有四行 x== "1"。对应的输出是一个 4x3 data.table,所有值都等于“1”
【解决方案2】:

这是否回答了您的问题?

df[df == 1] <- 0

输出:

 x1    x2     x3
 50    0      0     
 0     50     50        
 10    0      0     
 0     0      NA        
 0     100    0

数据:

df <- data.frame('x1' = c('50','1', '10', '1', '1'), "x2" = 
c('1','50', '1', '1', '100'), "x3" = c('1','50', '1', NA, '1'))

【讨论】:

  • 谢谢。不,我正在寻找一种方法来过滤掉 df 中的值,而不是更改它们。但是很高兴知道可以像这样更改 df 中的所有值?
【解决方案3】:

您可以保留variance 不为零的那些行。当我们使用%in%时,会保留缺失值的行。

df
#     x1 x2 x3
# 1    0  1  1
# 2    1  0  0
# 3 <NA>  1  1
# 4    1  1  1
# 5    1  0  1

df[!apply(df, 1, var) %in% 0, ]
#     x1 x2 x3
# 1    0  1  1
# 2    1  0  0
# 3 <NA>  1  1
# 5    1  0  1

数据:

我在第 3 行添加了一个缺失项。

df <- structure(list(x1 = c("0", "1", NA, "1", "1"), x2 = c("1", "0", 
"1", "1", "0"), x3 = c("1", "0", "1", "1", "1")), class = "data.frame", row.names = c(NA, 
-5L))

【讨论】:

    【解决方案4】:

    您可以使用rowSums 选择存在除 1 以外的单个值的行。

    df[rowSums(df != 1, na.rm = TRUE) > 0, ]
    #Another way
    #df[rowSums(df == 1, na.rm = TRUE) != ncol(df), ]
    
    #  x1 x2 x3
    #1  0  1  1
    #2  1  0  0
    #3  0  1  1
    #4  1  0  1
    

    或者使用dplyr

    library(dplyr)
    df %>% filter_all(any_vars(. != 1))
    

    【讨论】:

    • 感谢您的回答。但是使用这些解决方案,我仍然有包含“1”的行/列。 ,我需要在数据框中排除“1”的所有值/将所有值保留为“0”(如果可能,则为 NA)?
    • 我错过了什么,还是这个解决方案仍然返回观察值 == 1?
    • @MetteFoss 根据您的问题I would like to remove all observations equal to 1 across all columns 此答案从df 中删除第4 行,因为它全为1。如果这不是您想要的,请通过使用预期输出更新您的帖子来澄清它。还包括一个带有NA 的案例,以便清楚您想要什么。
    • 对不起,我的错误。关键是我需要从整个数据框中删除值 one 而不仅仅是一列。我已经编辑了问题?
    • @MetteFoss 您能否为示例显示您的预期输出以避免混淆。