r - 用函数子集向量的每个级别并返回一个新的数据帧(在 R 中)

标签 r subset

我有一个包含两个向量的简单数据框,“速度”和“ID”,如下所示:

mydata
ID     Speed
1   1  6.031847
2   1  7.050654
3   1  7.769475
4   1  8.838968
5   1  9.956571
6   1 11.146864
7   1 11.967616
8   1 13.078422
9   1 14.214301
10  1 14.974159
11  2 16.048627
12  2 17.070484
..  . .........

我想制作速度值前 20% 的数据帧子集:

subset0.20<-subset(mydata, Speed > quantile(Speed, prob = 1 - 20/100, na.rm=T))

但我不希望它用于整个数据集,因为这会返回给我每个 ID 的不等量的值。

因此,必须为每个 ID 计算前 20% 的值,然后应将每个 ID 的结果组合到一个新的数据框中。这个数据框将包含 8 行(这是我原始数据集 40 行的 20%)

所以我做了一些咬指甲并拔了一些头发并尝试了“for 循环”,例如:

for(i in 1:length(ID)){
   subset0.80<-subset(mydata[i], GForce > quantile(Speed, prob = 1 - 20/100, na.rm=T))
     }

诸如应用之类的东西:

apply(mydata$Speed, 1 ,function(x) (subset(x > quantile(Speed, prob = 1 - 20/100, na.rm=T))))

但我只是对 R 缺乏经验,无法让它正常工作。任何人都可以帮助我并向我解释我在这里做错的所有事情吗?

dput(mydata)
structure(list(ID = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4), Speed = c(6.03184705225504, 7.05065401832249, 
7.76947483668907, 8.83896842017956, 9.95657139135043, 11.1468640558647, 
11.9676155772803, 13.0784218506988, 14.2143010441769, 14.9741594881612, 
16.0486271520862, 17.0704843261466, 17.9324808839116, 19.1169673939822, 
20.0528330256269, 20.9320440815571, 22.0379467007031, 22.962355355126, 
24.0764744246649, 25.1182530133201, 26.0456043859692, 26.9528777031822, 
27.9414746553538, 29.129640434174, 29.9443040639644, 30.9226103003052, 
31.9932286699133, 32.9925644101585, 33.9930708538141, 35.0124438238874, 
35.9215486087666, 36.9015465999988, 38.1044534443389, 39.0368063088987, 
40.272189714015, 40.8993100278334, 41.9790311160737, 43.1027190745506, 
43.8575622361406, 45.0499599122387)), .Names = c("ID", "Speed"
), row.names = c(NA, -40L), class = "data.frame")

最佳答案

使用by,您可以为每个ID调用subset函数。然后,您可以使用 do.call bind 结果,将 list 转换为 data.frame

你可以这样做:

do.call(rbind,by(mydata,mydata$ID,FUN= function(x)
      subset(x, Speed > quantile(Speed, prob = 1 - 20/100, na.rm=T))))

     ID    Speed
1.9   1 14.21430
1.10  1 14.97416
2.19  2 24.07647
2.20  2 25.11825
3.29  3 33.99307
3.30  3 35.01244
4.39  4 43.85756
4.40  4 45.04996

关于r - 用函数子集向量的每个级别并返回一个新的数据帧(在 R 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15945396/

相关文章:

C++:读取数据集并检查 vector<Class> 是否是 vector<Class> 的子集

r - 按 R 中 2 列中的条件过滤(子集)(dplyr 或其他)

r - 设置种子后,该种子将对多长时间或多少代码块有效?

r - 在 rstan 中指定矩阵的先验分布

r - R 中多维数组的最优 Colmin

r - 使用 R2OpenBUGS 拟合威 bool

r - 使用对行号和值的过滤器进行选择

r - 根据两个协变量级别的对应关系选择数据帧的行

r - 基于 R 中条件的子集列表

r - 使用变量名通过 mutate 定义列内容