我假设我对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 05:46:16
我不知道为什么这个代码会起作用
for (i in ppl$grp) {
temp<-ppl[ppl$grp == i,]
sel<-rbind(sel,temp[max(temp$into),])
}max(temp$into)应该返回最大值--在大多数情况下它似乎不是整数。
此外,在每个for循环实例中构建一个带有rbind的data.frame也不是很好的实践(在任何语言中)。它需要退出一些类型检查和数组增长,这可能会变得非常昂贵。
此外,当该组有任何NAs时,max将返回NA。
还有一个问题是,你想对领带做些什么?你只想要一个结果还是全部?阿克伦给出的代码会给你所有的。
此代码将编写一个具有组max的新列。
ppl$grpmax <- ave(ppl$into, ppl$grp, FUN=function(x) { max(x, na.rm=TRUE ) } )然后,可以选择组中与
pplmax <- subset(ppl, into == grpmax)如果每个组只需要一个,那么可以删除重复项。
pplmax[!duplicated(pplmax$grp),]https://stackoverflow.com/questions/39579640
复制相似问题