簡體   English   中英

如何通過匯總行在數據框中創建新列?

[英]How can I create new column in data frame by aggregating rows?

我有一個大型(〜200k行)數據幀,其結構如下:

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')

假設當前是第7周,我想將過去4周的平均收入與本周的收入進行比較。 我想做的是在所有標識符匹配時為該平均值創建一個新列。

df_new <-
 data.frame(1, 'blue', 'm', 2016,7,50, 25 )

colnames(df_new) <- c('id', 'color', 'size', 'year', 'week','revenue', 't4ave')

我怎樣才能有效地做到這一點? 感謝您的幫助

好問題。 for循環的效率很低,但是由於您必須檢查先前條目的條件,因此這是我能想到的唯一解決方案(請注意,我也是R的中間人):

for (i in 1:nrow(df))
{
    # condition for all entries to match up
    if ((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$year[i] == df$year[i-1] == df$year[i-2] == df$year[i-3] == df$year[i-4])
    && (df$week[i] == df$week[i-1] == df$week[i-2] == df$week[i-3] == df$week[i-4]))

    # avg of last 4 entries' revenues
    avg <- mean(df$revenue[i-1] + df$revenue[i-2] + df$revenue[i-3] + df$revenue[i-4])

    # create new variable of difference between this entry and last 4's
    df$diff <- df$revenue[i] - avg
}

這段代碼可能會永遠用完,但是應該可以使用。 如果這是一次需要運行代碼的事情,那么應該沒問題。 否則,希望其他人能夠提供建議。

使用dplyrzoo解決方案。 想法是將相同的變量分組,例如idcolorsizeyear rollmean證明,使用rollmean來計算收入的滾動平均值。 使用na.pad = TRUEalign = "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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM