匹配行与列名称的循环并计算前面3列

时间:2018-02-13 22:03:40

标签: r

我试图在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天的平均值。如果你有关于如何更好地完成第一部分的提示,那就是我的耳朵。 希望你的人能帮助我。 非常感谢你的帮助。

1 个答案:

答案 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)
})