首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向量化还是for循环,还是应用函数?

向量化还是for循环,还是应用函数?
EN

Stack Overflow用户
提问于 2014-12-02 13:24:30
回答 1查看 110关注 0票数 0

我有一个有6列的数据帧。第1列保存日期,第2列个人和第3至6列用于计算。

代码语言:javascript
复制
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

代码语言:javascript
复制
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函数?

EN

回答 1

Stack Overflow用户

发布于 2014-12-02 15:38:23

dplyr包提供了非常好的laglead函数。

代码语言:javascript
复制
> 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日期。在这种情况下,您可能需要小心处理超前/滞后。

如果这样做是有意义的,您可以先聚合它们,然后再执行领先/滞后。

代码语言:javascript
复制
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))

这会产生:

代码语言:javascript
复制
  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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27242422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档