我有一个有6列的数据帧。第1列保存日期,第2列个人和第3至6列用于计算。
Date <- c(1, 1, 2, 2, 2, 3)
Ind <- c("a","a","a","b","c","c")
C <- c(5, 6, 5, 7, 8, 8)
D <- c(8, 8, 9, 9, 9, 9)
E <- c(8, 9, 11, 10, 9, 7)
F <- c(5, 6, 8, 5, 7, 4)
df <- data.frame(Date, Ind, C, D, E, F)我想执行一个计算(比如(C-E)+(D-F) )(在现实生活中,这些是坐标,我正在计算距离,但这不是我现在的问题所在)。
我想执行存储在新列(G)中的计算,在我使用第1天的列C和E的值与day+1中同一人的列E和F的值之间存在1天的差异。
我不确定我应该使用循环还是应用函数。这就是我到目前为止所尝试的,一个基于这个线程的矢量化操作和子集:Loop over rows of dataframe applying function with if-statement
df$G <- NA
df[!(df$Date ==(df$Date+1)), "G"] <- ((C-E)+(D-F))这是可行的,但它在同一行(C、D、E、F都来自同一行)的坐标上进行计算。我知道它为什么这样做,因为我没有说明从哪一行获取坐标。C和D需要取自where Date = Date行,E和F需要取自where Date = (Date+1)行。我意识到了,但我不知道该怎么做。
继续这条路线吗?在for循环中做吗?使用apply函数?
发布于 2014-12-02 15:38:23
dplyr包提供了非常好的lag和lead函数。
> library(dplyr)
> df %>% mutate(G = C + D + lead(E,1) + lead(F,1))
Date Ind C D E F G
1 1 a 5 8 8 5 28
2 1 a 6 8 9 6 33
3 2 a 5 9 11 8 29
4 2 b 7 9 10 5 32
5 2 c 8 9 9 7 28
6 3 c 8 9 7 4 NA对于最后一行,g为NA,因为没有下一个日期值。
编辑:
正如其他人所提到的,看起来您的示例数据有两个Ind==a日期。在这种情况下,您可能需要小心处理超前/滞后。
如果这样做是有意义的,您可以先聚合它们,然后再执行领先/滞后。
df %>% group_by(Date,Ind) %>%
summarise(C=mean(C),D=mean(D),E=mean(E),F=mean(F)) %>%
ungroup %>%
mutate(G = C + D + lead(E,1) + lead(F,1))这会产生:
Date Ind C D E F G
1 1 a 5.5 8 8.5 5.5 32.5
2 2 a 5.0 9 11.0 8.0 29.0
3 2 b 7.0 9 10.0 5.0 32.0
4 2 c 8.0 9 9.0 7.0 28.0
5 3 c 8.0 9 7.0 4.0 NAhttps://stackoverflow.com/questions/27242422
复制相似问题