Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何通过聚合行在数据框中创建新列?_R_Dataframe_Aggregate - Fatal编程技术网

R 如何通过聚合行在数据框中创建新列?

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

我有一个大的(~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','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