R 矢量化或循环或应用函数?
我有一个6列的数据框。第1列保存日期,第2列个人和第3列至第6列用于计算R 矢量化或循环或应用函数?,r,R,我有一个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,
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)
Datedplyr
包提供了非常好的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 NA
Ind a有两行用于日期1。您想做什么?距离通常是L1:
abs(C-D)+abs(E-F)
或L2:(C-D)^2+(E-F)^2
,即始终为正。@egilio您的描述有点混乱。能否显示此示例数据的预期输出。Date
列与3:5
和1:2
行相同。此外,它似乎按Ind
进行分组。所以,我不确定这是否正确。谢谢你指出这一点。我假设这不是数据的预期特性,因为OP没有提到如何处理它。我正在查看OP的代码df$Date==(df$Date+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 NA