首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R For循环应用max函数失败

R For循环应用max函数失败
EN

Stack Overflow用户
提问于 2016-09-19 18:16:38
回答 4查看 131关注 0票数 5

我假设我对R是新的,实际上我是想得到基本面。目前,我正在处理一个大型的dataframe (称为"ppl"),为了过滤一些行,我必须对它进行编辑。每一行都包含在一个组中,它的特征是一个强度(入)值和一个样本值。

代码语言:javascript
复制
       mz  rt      into   sample  tracker     sn   grp
 100.0153 126  2.762664      3    11908 7.522655   0
 100.0171 127  2.972048      2    5308  7.718521   0
 100.0788 272 30.217969      2    5309 19.024807   1
 100.0796 272 17.277916      3   11910  7.297716   1
 101.0042 128 37.557324      3   11916 27.991320   2
 101.0043 128 39.676014      2    5316 28.234918   2

第一个问题是:“我如何从每一组中选出强度最高的样本?”我尝试了一个for循环:

代码语言:javascript
复制
for (i in ppl$grp) {
temp<-ppl[ppl$grp == i,]
sel<-rbind(sel,temp[max(temp$into),])
}

事实上,它适用于ppl$grp == 0,但是下一个循环返回NAs行。然后,过滤后的dataframe(称为"sel")也应该存储已删除行的示例值。其内容应如下:

代码语言:javascript
复制
      mz  rt      into   sample  tracker     sn   grp
100.0171 127  2.972048   c(2,3)    5308  7.718521   0
100.0788 272 30.217969   c(2,3)    5309 19.024807   1
101.0043 128 39.676014   c(2,3)    5316 28.234918   2

为了得到这一点,我将使用以下方法:

代码语言:javascript
复制
lev<-factor(ppl$grp)
samp<-ppl$sample
samp2<-split(samp,lev)
sel$sample<-samp2

有什么暗示吗?因为我不能测试它,因为我还没有解决之前的问题。

非常感谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-09-20 02:58:56

使用base Rave选项是

代码语言:javascript
复制
ppl[with(ppl, ave(into, grp, FUN = max)==into),]

如果预期输出中的'sample‘列在每个'grp’中都有unique元素,那么在按'grp‘分组之后,将'sample’更新为‘paste’d unique元素的'sample',然后将‘unique’改为‘下降’,并将第一行改为‘slice’。

代码语言:javascript
复制
library(dplyr)
ppl %>%
    group_by(grp) %>% 
    mutate(sample = toString(sort(unique(sample)))) %>% 
    arrange(desc(into)) %>%
    slice(1L)
#       mz    rt      into sample tracker        sn   grp
#     <dbl> <int>     <dbl>  <chr>   <int>     <dbl> <int>
#1 100.0171   127  2.972048   2, 3    5308  7.718521     0
#2 100.0788   272 30.217969   2, 3    5309 19.024807     1
#3 101.0043   128 39.676014   2, 3    5316 28.234918     2
票数 1
EN

Stack Overflow用户

发布于 2016-09-19 18:28:12

我不确定我是否跟进你的问题。但也许这会让你开始。

代码语言:javascript
复制
library(dplyr)
ppl %>% group_by(grp) %>% filter(into == max(into)) 
票数 2
EN

Stack Overflow用户

发布于 2016-09-19 21:03:00

一种data.table替代方案:

代码语言:javascript
复制
library(data.table)
setkey(setDT(ppl),grp)
ppl <- ppl[ppl[,into==max(into),by=grp]$V1,]
##         mz  rt      into sample tracker        sn grp
##1: 100.0171 127  2.972048      2    5308  7.718521   0
##2: 100.0788 272 30.217969      2    5309 19.024807   1
##3: 101.0043 128 39.676014      2    5316 28.234918   2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39579640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档