【发布时间】:2015-07-03 04:33:21
【问题描述】:
假设我在数据框d1 中有一些数据,描述了不同样本个体吃不同食物的频率,最后一列描述了这些食物是否凉快吃。数据的结构是这样的。
OTU.ID<- c('pizza','taco','pizza.taco','dirt')
s1<-c(5,20,14,70)
s2<-c(99,2,29,5)
s3<-c(44,44,33,22)
cool<-c(1,1,1,0)
d1<-data.frame(OTU.ID,s1,s2,s3,cool)
print(d1)
OTU.ID s1 s2 s3 cool
1 pizza 5 99 44 1
2 taco 20 2 44 1
3 pizza.taco 14 29 33 1
4 dirt 70 5 22 0
我编写了一个函数,对于每个样本,s1:s3,消耗的凉爽食物的数量,以及消耗的食物总数。它在数据表的每一行上作为 for 循环运行(非常慢)。
cool.food.abundance<- function(food.table){
samps<-colnames(food.table)
#remove column names that are not sample names
samps<-samps[!samps %in% c("OTU.ID","cool")]
#create output vectors for for loop
id<-c()
cool.foods<-c()
all.foods<-c()
#run a loop that stores output ids and results as vectors
for(i in 1:length(samps)){
x<- samps[i]
y1<-sum(food.table[samps[i]]*food.table$cool)
y2<-sum(food.table[samps[i]])
id<-c(id,x)
cool.foods<-c(cool.foods,y1)
all.foods<-c(all.foods,y2)
}
#save results as a data frame and return the data frame object
results<-data.frame(id,cool.foods,all.foods)
return(results)
}
因此,如果您运行此函数,您将获得一个新表,其中包含样本 ID、样本食用的冷食数量以及样本食用的食物总数。
cool.food.abundance(d1)
id cool.foods all.foods
1 s1 39 109
2 s2 130 135
3 s3 121 143
如何用矢量计算替换这个 for 循环以加快速度?我真的希望该函数能够对使用 data.table 包中的 fread 函数加载的数据帧进行操作。
【问题讨论】:
标签: r