创建一个 Vector 以过滤掉多行 [duplicate]

Creating a Vector to filter out multiple rows [duplicate]

提问人:poole13 提问时间:10/10/2023 更新时间:10/10/2023 访问量:28

问:

我有一个数据框,其中包含一个名为“value”的变量。在该变量中,有数字范围(例如 90-94),但也有前面带有字母的范围,例如 LT、GE、LE 等。我想过滤掉前面有字母的行,只得到数字范围。

起初,我以为在过滤器语句中的字母后面加一个空格会起作用,但实际上,什么也没发生。

我的具体代码块:

    OHperformance <- OHperformance %>%
      filter(Value != ".",
             Value !="PS", 
             Value !="LT  ", 
             Value !="GE  ",
             Value != "LE  ")

然后,我能够制作一个载体,但必须将它们全部单独标记。

    OHperformance <- OHperformance %>%
      filter(!Value %in% c("LT50", "LE5",     "LE20", "LE10", "GE95", "GE90", "GE80", "GE50", ".", "PS"))

有没有更简单的方法可以摆脱带有 LE 或 GE 的行?

R DataFrame 筛选器 数据操作

评论

1赞 jpsmith 10/10/2023
您能否提供数据集和所需输出的可重现示例?您想完全删除那些带有字母数字值的 (),还是只是修改它们以保留数字?OHperformance %>% filter(!grepl("[A-Z]|\\.", value))

答:

0赞 SamR 10/10/2023 #1

删除带有字母的行的一种方法是查看如果从中删除非数字字符,是否会发生变化。我们可以使用正则表达式来匹配非数字字符Value"\\D"

\d:匹配任意数字。补码 \D 匹配任何非十进制数字的字符。

library(dplyr)
OHperformance  |>
    filter(
        Value == gsub("\\D", "", Value)
    )
#   Value
# 1     9
# 2    10
# 3     7
# 4     8
# 5     6
# 6     3

注意 - 这假设您的列只有整数,因为它将替换小数点。如果您有带有小数点的数字,也不要替换它。您可以使用类似的东西:

Value == gsub("[^0-9\\.]|^\\.$", "", Value)

此模式将替换除数字和小数点之外的所有内容,但如果它是整个字符串,它将替换小数点。

替代方法 - 胁迫和放弃numericNA

或者,由于本质上您只想保留数值,因此您可以强制使用和删除值来强制列。as.numeric()NA

OHperformance |>
    filter(!is.na(as.numeric(Value)))
# Same output

示例数据

OHperformance  <- structure(list(Value = c("LT50", "9", "10", "GE90", "LE5", "7", 
"8", "6", "GE95", "3")), class = "data.frame", row.names = c(NA, -10L))