我假设我对R是新的,实际上我是想得到基本面。目前,我正在处理一个大型的dataframe (称为"ppl"),为了过滤一些行,我必须对它进行编辑。每一行都包含在一个组中,它的特征是一个强度(入)值和一个样本值。
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循环:
for (i in ppl$grp) {
temp<-ppl[ppl$grp == i,]
sel<-rbind(sel,temp[max(temp$into),])
}事实上,它适用于ppl$grp == 0,但是下一个循环返回NAs行。然后,过滤后的dataframe(称为"sel")也应该存储已删除行的示例值。其内容应如下:
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为了得到这一点,我将使用以下方法:
lev<-factor(ppl$grp)
samp<-ppl$sample
samp2<-split(samp,lev)
sel$sample<-samp2有什么暗示吗?因为我不能测试它,因为我还没有解决之前的问题。
非常感谢。
发布于 2016-09-20 02:58:56
使用base R的ave选项是
ppl[with(ppl, ave(into, grp, FUN = max)==into),]如果预期输出中的'sample‘列在每个'grp’中都有unique元素,那么在按'grp‘分组之后,将'sample’更新为‘paste’d unique元素的'sample',然后将‘unique’改为‘下降’,并将第一行改为‘slice’。
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发布于 2016-09-19 18:28:12
我不确定我是否跟进你的问题。但也许这会让你开始。
library(dplyr)
ppl %>% group_by(grp) %>% filter(into == max(into)) 发布于 2016-09-19 21:03:00
一种data.table替代方案:
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 2https://stackoverflow.com/questions/39579640
复制相似问题