【问题标题】:r subset by multiple columns [closed]r 由多列组成的子集[关闭]
【发布时间】:2021-11-20 06:07:44
【问题描述】:

我对根据多列的特定条件对数据集进行子集化的逻辑有点困惑。

例如,如果这是我的数据集

ID   Sex Age  Score
1    M   4.2  19
1    M   4.8  21
2    F   6.1  23
2    F   6.7  45
3    F   9.4  39
4    M   8    33
5    M   10   56

Gender=Male 在Age(between, 6 to 11) 之间的可接受分数范围是Score(between, 34 to 100)。

最终的数据集将是,没有 ID 4

ID   Sex Age  Score
1    M   4.2  19
1    M   4.8  21
2    F   6.1  23
2    F   6.7  45
3    F   9.4  39
5    M   10   56

我试过这种方法,

Df0 <- subset( Df0, (between(Age, 6,11)&
                     Sex == "M"&
                     between(Score, 34, 100))

这没有用。任何建议都非常感谢。提前致谢。

【问题讨论】:

  • 这是一个错字,最后我们缺少)。

标签: r dataframe subset multiple-columns


【解决方案1】:
library(dplyr)
Df0 %>% 
    filter(Sex == 'M', between(Age, 6,11), between(Score, 34,100))

【讨论】:

  • 您只能在一个过滤器上使用,dplyr::filter(Sex == 'M', between(Age, 6,11), between(Score, 34,100))
【解决方案2】:

如果我正确理解您的解释以及显示的预期输出,您正在寻找这样的东西 -

library(dplyr)

df %>%
  group_by(ID) %>%
  filter(ifelse(Sex == 'M' & between(Age, 6,11), 
          between(Score, 34, 100), TRUE)) %>%
  ungroup

#     ID Sex     Age Score
#  <int> <chr> <dbl> <int>
#1     1 M       4.2    19
#2     1 M       4.8    21
#3     2 F       6.1    23
#4     2 F       6.7    45
#5     3 F       9.4    39
#6     5 M      10      56

between(Score, 34, 100) 仅在 Sex 为 'M' 且 Age 介于 6 和 11 之间时检查。

【讨论】:

  • 这对我有用。
【解决方案3】:

古典

subset(dat, Age > 6 & Age < 11 & Sex == 'M' & Score > 34 & Score < 100)
#   ID Sex Age Score
# 7  5   M  10    56

使用data.table

library(data.table)
subset(dat, between(Age, 6, 11)  & Sex == 'M' & between(Score, 34, 100))
#   ID Sex Age Score
# 7  5   M  10    56

或

subset(dat, Age %between% c(6, 11) & Sex == 'M' & Score %between% c(34, 100))
#   ID Sex Age Score
# 7  5   M  10    56

或完全data.table

setDT(df)[Sex == "M" & between(Age, 6, 11) & between(Score, 34, 100)]
#    ID Sex Age Score
# 1:  5   M  10    56

【讨论】:

  • 请不要急于回答,这是一个简单的错字。如果不是拼写错误,那么就是 100% 的错误。
  • 我们可以在使用data.table时使用setDT(df)[Sex == "M" &amp; between(Age, 6, 11) &amp; between(Score, 34, 100)] :)
  • @ThomasIsCoding 是的,我害怕这样的事情。谢谢! :)
猜你喜欢
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
相关资源
最近更新 更多