【问题标题】:In R, how to filter data by row from already split groups?在 R 中,如何从已经拆分的组中按行过滤数据?
【发布时间】:2013-07-30 16:28:04
【问题描述】:

所以我将我的数据集分成几组,我想知道如何从百分比列中找到大于或等于值 70 的行(注意:数据框中还有其他列,它们只是没有显示)

gdata <- split(data, Opportunity.Name)

Dataframe 看起来像这样(包含更多组):

Opportunity.Name:    Percentage
Bob                  50
Bob                  60
Bob                  20
Bob                  80
Bob                  90
Bob                  100
Jon                  100
Jon                  90

gdata$'Bob'     
Opportunity.Name  Percentage
Bob                  50
Bob                  60
Bob                  20
Bob                  80
Bob                  90
Bob                  100

我想应用一些函数来过滤掉 50、60 和 20 百分比的行并保留其他值(并让它为我创建的所有组执行此操作)。谢谢!

【问题讨论】:

  • “所以我将我的数据集分成了几个组” - 为什么?没有多少情况值得这样做(当然也不用做你要求的计算)。
  • 我需要按机会名称计算中位数/均值/总和,然后再取整组数据的更多中位数/均值/总和。如果有更简单/替代的方法,我很想知道!!
  • 是的,有很多更好的方法,一种是使用data.table。类似于dt = data.table(your_df); dt[, list(mean.person = mean(Percentage), median.person = median(Percentage)), by = Opportunity][, list(mean.total = mean(mean.person))] 的东西;在 SO 和 Google 上搜索data.table,如果您有任何疑问 - 您知道 SO 在哪里 :)

标签: r split


【解决方案1】:

试试这个:

lapply(gdata, function(x){x[x$Percentage>=70,]})

给予:

$Bob
  Opportunity.Name Percentage
4              Bob         80
5              Bob         90

$Jon
  Opportunity.Name Percentage
6              Jon        100
7              Jon         90

更新:要保留百分比为零的记录,请使用管道运算符添加or 子句:

lapply(gdata, function(x){x[x$Percentage>=70 | x$Percentage==0,]})

或者,如果您愿意,可以使用subset 语法来实现相同的结果:

lapply(gdata, function(x){subset(x, Percentage>=70 | Percentage==0)})

【讨论】:

  • 看起来不错!有没有办法保持一定的价值? (我希望所有值大于或等于 70 并保持 0 的值)
  • 谢谢!超级有用的答案。
【解决方案2】:

如果你非常明确地知道你不想要什么值,你可以使用

d <- subset(gdata, Percentage != 50 & Percentage != 60 & Percentage !=20)

【讨论】:

  • 1) gdata 是一个列表,而不是一个数据框。但是您可以将此子集应用于data 对象,然后将split 应用于获得所需的结果。 2) 为什么不直接使用Percentage &gt;= 70 而不是将一堆!= 子句组合在一起?
  • 如果用户想要删除具有特定百分比值的行,我的意思是这个选项。这个问题不清楚是否是低于 70% 的值。
  • 其实问题的第一行就提供了“大于等于70”的规范。而且,您的解决方案仍然会返回错误,因为您不能在列表上使用子集,这就是 gdata 对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
相关资源
最近更新 更多