【问题标题】:data frame columns: how can I use loops in this case?数据框列:在这种情况下如何使用循环?
【发布时间】:2020-08-21 21:48:39
【问题描述】:

我有一个包含 2 列的数据框:人和点。在我的实际数据集中有超过 1000 人。

我的目标:我需要找到超过 126 分的人。

df1:

person      points
abc
abc        1
abc
abc        2
abc1    
abc1       1
abc1

我用过这段代码:

df1 <- read.csv("df1.csv")
  points_to_numeric <- as.numeric(df1$points)

  person_filtered <- df1 %>%
  group_by(person) %>%
  dplyr::filter(sum(points_to_numeric, na.rm = T)>126)%>%
  distinct(person) %>%
  pull()

person_filtered

当我输入此代码时,我得到了 800 个唯一的人。但是如果我想知道有多少人的分数低于 126 - 我也会得到 800 个独特的人。所以看起来它不起作用。

【问题讨论】:

  • 如果没有数据可供我们使用,则无法重现。使用dput(head(df1)) 生成一个小的测试数据集
  • 您的代码不起作用,因为points_to_numeric 未分组,因为它不在df1 对象内,它应该是df1$points &lt;- as.numeric(df1$points),然后是...filter(sum(points...

标签: r loops


【解决方案1】:

Tidyverse 解决方案。返回一个包含超过 126 个点的人的向量。

library(tidyverse)

person_filtred <- df1 %>%
  group_by(person) %>%
  dplyr::filter(sum(points, na.rm = T)>126) %>%
  distinct(person) %>%
  pull()

【讨论】:

  • 我收到此错误:错误:filter() 输入问题..1。 x 参数 i 的无效“类型”(字符)输入 ..1sum(points, na.rm = T) &gt; 126。 i 错误发生在第 1 组:person = "
  • 试试 dplyr::filter - 有一个 stats::filter 可以屏蔽 dplyr 函数。我会更新答案以反映。
【解决方案2】:

summarise 在这个用例中更为惯用。

library(tidyverse)

person_filtred <- df1 %>%
  group_by(person) %>%
  summarise(totalPoints=sum(points, na.rm=TRUE)) %>%
  filter(totalPoints >= 126)

【讨论】:

  • 不幸的是,我又遇到了错误。错误:summarise() 输入 totalpoints 有问题。 x 参数 i 的无效“类型”(字符)输入 totalpointssum(points, na.rm = T)。 i 错误发生在第 1 组:person = "
  • 看起来你需要用as.numeric(points)points强制转换为数字
  • 我已经这样做了,当我使用类(df1$points)时,我得到的答案是点数是数字。
  • 请更新您的问题reproducible example
【解决方案3】:

也许你可以试试下面的代码

subset(aggregate(.~person,df1,sum), points > 126)

subset(df1,ave(points,persion,FUN = sum)>126)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    相关资源
    最近更新 更多