【问题标题】:Filter values from a dataframe using group_by or filter?使用 group_by 或过滤器从数据框中过滤值?
【发布时间】:2018-03-21 07:52:36
【问题描述】:

您好,我有以下示例, df

#First Name Second Name Subject Score
#Harry  Kane    Biology 0
#Harry  Kane    Physics 25
#Harry  Kane    Math    19
#Harry  Kane    Social  16
#Harry  Kane    History 19

#Tom    Hault   Biology 0
#Tom    Hault   Physics 22
#Tom    Hault   Math    24
#Tom    Hault   Social  25
#Tom    Hault   History 20

#Ben    Capario Biology 0
#Ben    Capario Physics 12
#Ben    Capario Math    15
#Ben    Capario Social  16
#Ben    Capario History 18

#Phil   Adams   Biology 20
#Phil   Adams   Physics 22
#Phil   Adams   Math    17
#Phil   Adams   Social  15
#Phil   Adams   History 18

#Shawn  Salzensky   Biology 25
#Shawn  Salzensky   Physics 22
#Shawn  Salzensky   Math    18
#Shawn  Salzensky   Social  19
#Shawn  Salzensky   History 12

每个人都有自己的姓名和在各个科目中的分数。

我正在尝试以这种格式输出,

df1

#First Name Second Name Subject Score
#Harry  Kane    Biology 0
#Harry  Kane    Physics 25
#Tom    Hault   Biology 0
#Tom    Hault   Physics 22
#Ben    Capario Biology 0
#Ben    Capario Physics 12

我试过这个:

 df1 <- filter(df, {Subject=='Biology'&`Score`== 0} | {Subject=='Physics'&`Score`!= 0})

但是,它需要 'subject' 和 'score' 分别返回包含生物学及其各自分数的元素,以及 == 0 的分数。

还有其他方法吗?

【问题讨论】:

  • 您能提供有用的样本数据吗?
  • filter 保留某些行。您可以尝试在此处从长转换为宽,这样每人一排。
  • 将它们保存为data.frame,然后使用table。您能否以data.frame 格式上传您的数据,这样很容易复制您的示例?
  • 我重读了您的问题并意识到我不知道您在寻找什么。如果你想要一些看起来像“我正在尝试以这种格式输出”下的代码块的东西,它在下面。不过,完全不清楚您的“我已经尝试过这个”代码块得到了什么。
  • 嗨,丹,感谢您的代码。它奏效了,给了我想要的输出。

标签: r filter group-by dplyr


【解决方案1】:

如果您想要的是所有有Biology Score0 的情况(行)和所有有Physics Score 的情况(行)不是@987654326 @,您的代码形式有效。不过,格式化建议:使用() 括起逻辑表达式。在 dplyr 调用中,除非变量名中有空格,否则不要引用变量名。不要交替使用引号和反引号。

df1 <- filter(df, (Subject == 'Biology' & Score == 0) | (Subject == 'Physics' & Score != 0))
df1
#   First.Name Second.Name Subject Score
# 1      Harry        Kane Biology     0
# 2      Harry        Kane Physics    25
# 3        Tom       Hault Biology     0
# 4        Tom       Hault Physics    22
# 5        Ben     Capario Biology     0
# 6        Ben     Capario Physics    12
# 7       Phil       Adams Physics    22
# 8      Shawn   Salzensky Physics    22

我要补充一点,数据可能看起来很奇怪,但很整洁。每一行都是对分数的观察。这就是您想要数据的方式,即使它看起来不像成绩册。

数据:

df <- data.frame("First Name" = rep(c("Harry", "Tom", "Ben", "Phil", "Shawn"), each = 5),
                 "Second Name" = rep(c("Kane", "Hault", "Capario", "Adams", "Salzensky"), each = 5),
                 Subject = rep(c("Biology", "Physics", "Math", "Social", "History"), times = 5),
                 Score = c(0, 25, 19, 16, 19, 0, 22, 24, 25, 20, 0, 12, 15, 16, 18, 20, 22, 17, 15, 18, 25, 22, 18, 19, 12),
                 stringsAsFactors = FALSE)
df
   First.Name Second.Name Subject Score
1       Harry        Kane Biology     0
2       Harry        Kane Physics    25
3       Harry        Kane    Math    19
4       Harry        Kane  Social    16
5       Harry        Kane History    19
6         Tom       Hault Biology     0
7         Tom       Hault Physics    22
8         Tom       Hault    Math    24
9         Tom       Hault  Social    25
10        Tom       Hault History    20
11        Ben     Capario Biology     0
12        Ben     Capario Physics    12
13        Ben     Capario    Math    15
14        Ben     Capario  Social    16
15        Ben     Capario History    18
16       Phil       Adams Biology    20
17       Phil       Adams Physics    22
18       Phil       Adams    Math    17
19       Phil       Adams  Social    15
20       Phil       Adams History    18
21      Shawn   Salzensky Biology    25
22      Shawn   Salzensky Physics    22
23      Shawn   Salzensky    Math    18
24      Shawn   Salzensky  Social    19
25      Shawn   Salzensky History    12

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 2013-03-29
    相关资源
    最近更新 更多