我试图在R中进行一些计算。我有一个数据集,在列中我有id,startdate,然后每天从2014年到2017年。 现在每个id都有不同的开始日期。每个日期都附有个人身份特定化学物质的浓度。
我的数据中的示例如下所示:
id time 20140101 20140102 20140103 20140104 20140105 20140106 20140107
1 1 20141119 2.6 2.5 4.1 4.8 3.1 1.8 3.5
2 4 20150403 1.7 1.6 2.8 3.4 2.0 1.2 1.9
3 7 20140104 2.2 2.2 3.7 4.4 2.6 1.3 2.9
4 8 20141027 2.7 2.5 4.1 4.9 3.3 1.8 3.6
5 9 20141112 2.6 2.4 3.9 4.7 3.1 1.7 3.4
现在我要做的是运行一个循环通过每行id和时间组合的脚本,例如“1 20141119”或“8 20141027”,并将日期数字与colnames匹配并给出相应的浓度值。 所以组合“7 20140104”给了我浓度4.4 在此之后我想做同样的事情,然后采取日期并在时间日期之前平均3天。所以对于组合“7 20140104”平均日期20140102 20140103 20140104浓度为id 7
我做了一个小测试数据框
id <- 12:18
date <- c("c","d","e","f","c","d","e")
a <- rnorm(7, 2, 1)
b <- rnorm(7, 2, 1)
c <- rnorm(7, 2, 1)
d <- rnorm(7, 2, 1)
e <- rnorm(7, 2, 1)
f <- rnorm(7, 2, 1)
df <- data.frame(id, date, a, b, c, d, e, f)
这是我对问题第一部分的解决方案。
for(i in 1:nrow(df)){
conc <- df[i, df[i,"date"]==colnames(df)]
print(conc)
}
对第一部分来说足够有效,但目前我不知道如何做3天的平均值。如果你有关于如何更好地完成第一部分的提示,那就是我的耳朵。 希望你的人能帮助我。 非常感谢你的帮助。
答案 0 :(得分:0)
如果我已经正确理解了这个问题,给定一个值,你想获得该行的下一个值并返回3个值的平均值。
假设这些日期列是有序的,我已经调整了你的循环以包含我认为你想要的东西。不是最优雅的代码,但我试图在一步一步的庄园中展示它:
for (i in 1:1) {
conc <- df[i, df[i,"date"]==colnames(df)]
conPos <- which(df[i,"date"]==colnames(df)) # Get the position
av <- df[i, (conPos:(conPos+2))] # Get the next to columns values
print(rowMeans(av)) # Get the average
}
可能更有效的方法(取决于数据集的大小)是代替for循环,使用apply函数。例如:
apply (df, MARGIN = 1, FUN = function(x, i){
position <- (which(x[['date']] == colnames(df)))
threeDayAverage <- as.numeric((x[(position:(position+2))]))
print(sum(threeDayAverage) / 3)
})