我正在尋找一種操作數據框內多個變量的有效方法。現在我正在使用dplyr,但是這對於更多的變量來說很麻煩。 假設我有以下數據框,其中brd是汽車品牌,ye是一年,type是汽車類型,cy和hp是類型特徵。在一個循環中總結並生成多個變量
brd <-c("BMW","BMW","BMW","Volvo","Volvo", "Volvo","BMW","BMW","BMW","Volvo","Volvo","Volvo")
ye <- c(99,99,99,99,99,99,98,98,98,98,98,98)
type <- c(1,2,3,1,2,3,1,2,3,1,2,3)
cy <- c(1895,1991,1587,2435,2435,1596,1991,1588,1984,1596,1991,1588)
hp <- c(77,110,80,103,103,75,110,77,93,75,110,77)
df <- as.data.frame(brd)
df$ye <- ye
df$type <- type
df$cy <- cy
df$hp <- hp
df
brd ye type cy hp
1 BMW 99 1 1895 77
2 BMW 99 2 1991 110
3 BMW 99 3 1587 80
4 Volvo 99 1 2435 103
5 Volvo 99 2 2435 103
6 Volvo 99 3 1596 75
7 BMW 98 1 1991 110
8 BMW 98 2 1588 77
9 BMW 98 3 1984 93
10 Volvo 98 1 1596 75
11 Volvo 98 2 1991 110
12 Volvo 98 3 1588 77
每一年,我想計算的產品特性的總和同一品牌的其他所有產品,並將其添加爲新的變量數據框。現在,我使用dplyr這樣的:
library(dplyr)
df <- df %>% group_by(brd, ye) %>%
mutate(sumall_cy = sum(cy),
sumall_hp = sum(hp))
df <- df %>%
mutate(sumother_cy = sumall_cy-cy,
sumother_hp = sumall_li-hp)
所以,我得到
brd ye type cy hp sumall_cy sumall_hp sumother_cy sumother_hp
<fctr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 BMW 99 1 1895 77 5473 267 3578 190
2 BMW 99 2 1991 110 5473 267 3482 157
3 BMW 99 3 1587 80 5473 267 3886 187
4 Volvo 99 1 2435 103 6466 281 4031 178
5 Volvo 99 2 2435 103 6466 281 4031 178
6 Volvo 99 3 1596 75 6466 281 4870 206
7 BMW 98 1 1991 110 5563 280 3572 170
8 BMW 98 2 1588 77 5563 280 3975 203
9 BMW 98 3 1984 93 5563 280 3579 187
10 Volvo 98 1 1596 75 5175 262 3579 187
11 Volvo 98 2 1991 110 5175 262 3184 152
12 Volvo 98 3 1588 77 5175 262 3587 185
有沒有更有效的方法?我正在考慮像這個stata代碼循環:
foreach x of varlist hp cy {
bysort ye: egen sumall_`x'= sum(`x')
gen sumother_`x'=(sumall_`x' -`x')}
任何意見將不勝感激。
您可以在以'df'開頭的管道中調用'left_join'(例如'left_join(。,summarize())'來生成組級摘要,然後像你一樣進行mutate'這裏。它不會做更少的工作,但所有的工作都在同一個管道內,如果你關心的話。 – ulfelder