R 矢量化或循环或应用函数?

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,

我有一个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)

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