R 如何通过聚合行在数据框中创建新列?
我有一个大的(~200000行)数据帧,其结构如下:R 如何通过聚合行在数据框中创建新列?,r,dataframe,aggregate,R,Dataframe,Aggregate,我有一个大的(~200000行)数据帧,其结构如下: df <- data.frame(c(1,1,1,1,1), c('blue','blue','blue','blue','blue'), c('m','m','m','m','m'), c(2016,2016,2016,2016,2016),c(3,4,5,6,7), c(10,20,30,40,50)) colnames(df) <- c('id', 'color', 'size', 'year', 'week','rev
df <-
data.frame(c(1,1,1,1,1), c('blue','blue','blue','blue','blue'), c('m','m','m','m','m'), c(2016,2016,2016,2016,2016),c(3,4,5,6,7), c(10,20,30,40,50))
colnames(df) <- c('id', 'color', 'size', 'year', 'week','revenue')
df好问题。for循环效率很低,但由于您必须检查先前条目的条件,因此这是我能想到的唯一解决方案(请注意,我也是R的中间人):
for(1中的i:nrow(df))
{
#所有条目匹配的条件
如果((i>5)和&(df$id[i]==df$id[i-1]==df$id[i-2]==df$id[i-3]==df$id[i-4])
&&(df$color[i]==df$color[i-1]==df$color[i-2]==df$color[i-3]==df$color[i-4])
&&(df$size[i]==df$size[i-1]==df$size[i-2]==df$size[i-3]==df$size[i-4])
&&(df$年[i]==df$年[i-1]==df$年[i-2]==df$年[i-3]==df$年[i-4])
&&(df$周[i]==df$周[i-1]==df$周[i-2]==df$周[i-3]==df$周[i-4]))
#最后4项收入的平均值
avg好问题。for循环效率很低,但由于您必须检查先前条目的条件,这是我能想到的唯一解决方案(请注意,我也是R的中间人):
for(1中的i:nrow(df))
{
#所有条目匹配的条件
如果((i>5)和&(df$id[i]==df$id[i-1]==df$id[i-2]==df$id[i-3]==df$id[i-4])
&&(df$color[i]==df$color[i-1]==df$color[i-2]==df$color[i-3]==df$color[i-4])
&&(df$size[i]==df$size[i-1]==df$size[i-2]==df$size[i-3]==df$size[i-4])
&&(df$年[i]==df$年[i-1]==df$年[i-2]==df$年[i-3]==df$年[i-4])
&&(df$周[i]==df$周[i-1]==df$周[i-2]==df$周[i-3]==df$周[i-4]))
#最后4项收入的平均值
avg一种使用dplyr
和zoo
的解决方案。其思想是对相同的变量进行分组,例如id
、color
、size
和year
。然后,使用rollmean
计算收入的滚动平均值。使用na.pad=TRUE
和align=“right”
以确保计算覆盖最近几周。最后,使用lag
来“移动”计算结果以满足您的需要
library(dplyr)
library(zoo)
df2 <- df %>%
group_by(id, color, size, year) %>%
mutate(t4ave = rollmean(revenue, 4, na.pad = TRUE, align = "right")) %>%
mutate(t4ave = lag(t4ave))
df2
# A tibble: 5 x 7
# Groups: id, color, size, year [1]
id color size year week revenue t4ave
<dbl> <fctr> <fctr> <dbl> <dbl> <dbl> <dbl>
1 1 blue m 2016 3 10 NA
2 1 blue m 2016 4 20 NA
3 1 blue m 2016 5 30 NA
4 1 blue m 2016 6 40 NA
5 1 blue m 2016 7 50 25
库(dplyr)
图书馆(动物园)
df2%
分组依据(id、颜色、大小、年份)%>%
变异(t4ave=rollmean(收入,4,na.pad=TRUE,align=“right”))%>%
突变(t4ave=滞后(t4ave))
df2
#一个tibble:5x7
#组:id、颜色、大小、年份[1]
id颜色大小年周收入t4ave
1蓝色m 2016 3 10 NA
2 1蓝色m 2016 4 20 NA
3 1蓝色m 2016 5 30北美
4 1蓝色m 2016 6 40 NA
5 1蓝色m 2016 7 50 25
一种使用dplyr
和zoo
的解决方案。其思想是对相同的变量进行分组,例如id
、color
、size
和year
。然后,使用rollmean
计算收入的滚动平均值。使用na.pad=TRUE
和align=“right”
以确保计算覆盖最近几周。最后,使用lag
来“移动”计算结果以满足您的需要
library(dplyr)
library(zoo)
df2 <- df %>%
group_by(id, color, size, year) %>%
mutate(t4ave = rollmean(revenue, 4, na.pad = TRUE, align = "right")) %>%
mutate(t4ave = lag(t4ave))
df2
# A tibble: 5 x 7
# Groups: id, color, size, year [1]
id color size year week revenue t4ave
<dbl> <fctr> <fctr> <dbl> <dbl> <dbl> <dbl>
1 1 blue m 2016 3 10 NA
2 1 blue m 2016 4 20 NA
3 1 blue m 2016 5 30 NA
4 1 blue m 2016 6 40 NA
5 1 blue m 2016 7 50 25
库(dplyr)
图书馆(动物园)
df2%
分组依据(id、颜色、大小、年份)%>%
变异(t4ave=rollmean(收入,4,na.pad=TRUE,align=“right”))%>%
突变(t4ave=滞后(t4ave))
df2
#一个tibble:5x7
#组:id、颜色、大小、年份[1]
id颜色大小年周收入t4ave
1蓝色m 2016 3 10 NA
2 1蓝色m 2016 4 20 NA
3 1蓝色m 2016 5 30北美
4 1蓝色m 2016 6 40 NA
5 1蓝色m 2016 7 50 25
您的df_new
是否应该替换相应的行或追加它?似乎您需要使用分组功能(例如by
或dplyr::group_by
)使用zoo::rollappy
。您认为这个新列对于预先存在的行的值是多少?理想情况下,它会附加现有行。因此,如果df$week的值为3、4、5、6或7,则会创建新列,并为第7周(当前周)中每个唯一的特征排列计算t4aveweek=3,4,5,6中的每个值的t4ave=0。如果我从逻辑上理解了你想要什么,并且从分析上发现它很难处理,那么任何实现类似结果的方法都是有帮助的。我的意思是,它破坏了数据的理想性质:你现在不能再假设所有行都具有相同的含义:行Is是一周的总和,除非同一周有两个(等),在这种情况下,其中一个是每周数据,一个是4周总结,要知道我需要知道总结列的非总结值是什么…另一个…你知道我要说什么吗?也许这只是为了输出/报告,那么好吧,但是…我不完全确定我是否理解你的担忧。这主要是为了r报告目的,特别是查看本周与后续四周平均值(本周未包括在内)的比较情况识别本周出现尖峰/下降的变量。感谢您的帮助和迄今为止的思考。您的df_new
是否应该替换相应的行或追加它?似乎您需要使用分组功能(例如by
或dplyr::group_by
)使用zoo::rollappy
。您认为这个新列对于预先存在的行的值是多少?理想情况下,它会附加现有行。因此,如果df$week的值为3、4、5、6或7,则会创建新列,并为第7周(当前周)中每个唯一的特征排列计算t4ave如果week=3,4,5,6,则每个值的t4ave=0。如果我从逻辑上理解了你想要什么,并且从分析上发现很难处理,那么任何类似的方法都会很有帮助。我的意思是
library(dplyr)
library(zoo)
df2 <- df %>%
group_by(id, color, size, year) %>%
mutate(t4ave = rollmean(revenue, 4, na.pad = TRUE, align = "right")) %>%
mutate(t4ave = lag(t4ave))
df2
# A tibble: 5 x 7
# Groups: id, color, size, year [1]
id color size year week revenue t4ave
<dbl> <fctr> <fctr> <dbl> <dbl> <dbl> <dbl>
1 1 blue m 2016 3 10 NA
2 1 blue m 2016 4 20 NA
3 1 blue m 2016 5 30 NA
4 1 blue m 2016 6 40 NA
5 1 blue m 2016 7 50 25