【问题标题】:R Select Row By Ending ValueR按结束值选择行
【发布时间】:2021-10-09 14:59:11
【问题描述】:
data=data.frame("grade"=c(1, 2, 3, 1, 2, 3),
                "class"=c('a', 'a', 'a', 'b', 'b', 'b'),
                "size"=c(1, 1, 2, 2, 2, 1),
                "var"=c('q33', 'q35', 'q39', 'q33', 'q35', 'q39'),
                "score"=c(5, 8, 7, 3, 7, 5))

如果假设我希望对数据进行子集化以排除任何“var”以“5”结尾的行,我该怎么做?希望的输出:

data1=data.frame("grade"=c(1, 3, 1, 3),
                "class"=c('a', 'a', 'b', 'b'),
                "size"=c(1,2, 2, 1),
                "var"=c('q33', 'q39', 'q33', 'q39'),
                "score"=c(5, 7, 3,  5))

【问题讨论】:

  • 看看内置函数endsWith

标签: r data.table gsub


【解决方案1】:

我们可以使用grepl$来指定字符串的结尾

subset(data,  !grepl('5$', var))
#   grade class size var score
#1     1     a    1 q33     5
#3     3     a    2 q39     7
#4     1     b    2 q33     3
#6     3     b    1 q39     5

如果我们需要同时检查第一个和最后一个,使用^指定开始

subset(data, !grepl('^5|5$', var))

在这种情况下,开始字符不是数字,如果我们要检查数字的第一次出现

subset(data, !grepl('\\D+5|5$', var))

【讨论】:

  • grmbl.. 打败我吧...data[ grepl( "5$", data$var ), ]
  • @akrun 这里是另一个想法,以防万一有人可以利用它。如果你想要同样的东西,但如果最后一个值为 5 而不是删除,如果第一个或第一个数字是 5 怎么办?
【解决方案2】:

正如@Frank 提到的,我们可以使用需要输入字符的内置endsWith

subset(data, !endsWith(var, "5"))

#  grade class size var score
#1     1     a    1 q33     5
#3     3     a    2 q39     7
#4     1     b    2 q33     3
#6     3     b    1 q39     5

数据

data <- data.frame(grade=c(1, 2, 3, 1, 2, 3),
                   class=c('a', 'a', 'a', 'b', 'b', 'b'),
                   size=c(1, 1, 2, 2, 2, 1),
                   var=c('q33', 'q35', 'q39', 'q33', 'q35', 'q39'),
                   score=c(5, 8, 7, 3, 7, 5), stringsAsFactors = FALSE)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-08
    • 2020-07-16
    • 2021-06-17
    • 2019-02-25
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    相关资源
    最近更新 更多