[英]How can I create a column identifying rows consisting only of new data in a summarized data frame?
[英]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
}
這段代碼可能會永遠用完,但是應該可以使用。 如果這是一次需要運行代碼的事情,那么應該沒問題。 否則,希望其他人能夠提供建議。
使用dplyr
和zoo
解決方案。 想法是將相同的變量分組,例如id
, color
, size
和year
。 rollmean
證明,使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.