楼主: ltxmu
5297 16

[实际应用] 根据最大值取对应的数据 [推广有奖]

11
fdsasdfddsa 发表于 2018-4-17 23:18:27 |只看作者 |坛友微信交流群
ltxmu 发表于 2018-4-16 12:09
我的结果是这样
你在定义find_col_max的时候,引用A.ID要用a$A.ID

使用道具

12
ltxmu 发表于 2018-4-18 11:31:59 |只看作者 |坛友微信交流群
fdsasdfddsa 发表于 2018-4-17 23:18
你在定义find_col_max的时候,引用A.ID要用a$A.ID
学习了!非常感谢!

使用道具

13
ltxmu 发表于 2018-4-18 15:32:05 |只看作者 |坛友微信交流群
奇怪了,现在又不行了,我运行的结果是这样。怎么数据都变成字符串型的了?但是我转换成数值型后数据变得和原始数据不一样了

T7%~8LU6AE(}Q7_0L]K9WAY.png (31.04 KB)

T7%~8LU6AE(}Q7_0L]K9WAY.png

使用道具

fdsasdfddsa 发表于 2018-4-10 14:39
看我图上的运行结果

按我的理解,id=1的人对应的b有1,2,5,所以取出5;c有5,6,9,所以取出9;
你好,如果含有缺失值呢,有没有什么办法呢

使用道具

15
fdsasdfddsa 发表于 2018-4-22 18:14:56 |只看作者 |坛友微信交流群
ltxmu 发表于 2018-4-18 15:32
奇怪了,现在又不行了,我运行的结果是这样。怎么数据都变成字符串型的了?但是我转换成数值型后数据变得和 ...

上面的错误我不是很清楚怎么发生的,可能要提供完整代码

不过重新看了一下,发现之前误解了你的描述。你是要依据B这一行的最大值取出整行;而我之前的代码把除了A.ID的每一列都求了最大值后返回回来。
下面是修改后的代码,加了一点注释。如果有问题再问


  1. #编造的数据
  2. id=c(1,1,2,2,1)
  3. b=c(1,2,3,4,5)
  4. c=c(5,6,7,3,0)
  5. test=data.frame(cbind(id,b,c))
  6. #处理代码
  7. find_col_max=function(x) tapply(x,test[,"id"],FUN = max) #把test[,"id"]改成你存放的人编号的变量
  8. #上面定义了一个函数find_col_max,能以test[,"id"]为类别标识,把输入的列表以这个标识向量先分类后找出每个类的最大值
  9. a=as.data.frame(apply(test[c("id","b")],MARGIN = 2,find_col_max)) #把test改成你的data frame变量,b换成作为依据最大值的列
  10. #上面是把test的“id”和“b”两列分别扔进find_col_max里,先以id为类别分类后求出最大值,然后把返回的矩阵转换成数据框a

  11. index=c()
  12. for(i in 1:length(a[,"id"])){
  13.   index=c(index,which(a[i,"id"]==test["id"] & a[i,"b"]==test["b"]))#把test改成你的data frame变量,id换成你存放的人编号的列名,b换成作为依据最大值的列
  14. }#用for循环遍历a,找出a的每一行原本对应的是test的哪一行,记录在向量index里

  15. output=test[index,]#输出数据框test由向量index指定的行
  16. output
复制代码


注:上面每一个引号的列名都要换成你自己的。

经管之家的网站发$会出错,只好用各种带逗号和引号的中括号来代替









使用道具

16
fdsasdfddsa 发表于 2018-4-22 18:20:05 |只看作者 |坛友微信交流群
大膜汪爱统计 发表于 2018-4-18 21:45
你好,如果含有缺失值呢,有没有什么办法呢
楼主的问题我先前理解有误,麻烦先看一下15楼
你的要求和楼主的一样,还是像我之前理解的那样?另外b这一列(求最大值作为依据的那一列)上有缺失值吗

使用道具

17
大白Max 发表于 2018-11-19 14:19:33 |只看作者 |坛友微信交流群
遇到了同样的问题,看了几个人的答案都不对。刚刚解决了,答案如下

#编造的数据
id=c(1,1,2,2,1)
b=c(1,2,5,4,3)
c=c(9,6,8,7,5)
test=data.frame(cbind(id,b,c))
#处理代码
result<- test %>%
  group_by(id) %>%                   #对不同id进行分组处理
  filter(c==max(c,na.rm=TRUE))   #筛选出每个ID下c值等于最大c值的行


na.rm=TRUE是用来忽略缺失值的,要是你的数据里面还有inf什么的,可以自己参照filter的参数取改

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-6-19 18:18