大量组变量:在组内有效移动列数据高效[面板数据]

时间:2016-07-10 02:26:41

标签: r excel data-manipulation large-data

简短问题:我想将数据按行分组向上移动一行:在组内,第一行替换为第二行数据,第二行替换为第三行等。< strong>新列的最后一行为0 。我有40,000个分组级别和230,000个行。

长问题:我有一个关于消费者购买的面板数据,多个用户多次购买。组变量是具有品牌选择数据的消费者。我想复制第二选择数据来计算同一用户的某个品牌的回购率。定义回购:“第一次购买”的回购是“第二次购买”;回购“第二次购买”是“第三次购买”最后一次购买没有回购。

对于r中的这种简单数据操作,我的代码需要 8分钟,但在Excel中仅需1秒。

数据就像(按日购物者第一天和第一天排序):

    Day Shopper Choice
    1   A   Coke
    2   A   Coke
    1   B   Sprite
    1   C   Coke
    2   C   Pepsi
    3   C   Coke
    1   D   Sprite
    2   D   Sprite

所需的输出:

Day Shopper Choice  choice 2
 1  A   apple        *apple*
 2  A   apple           0
 1  B   Banana          0
 1  C   apple          Banana
 2  C   Banana         apple 
 3  C   apple           0
 1  D   berry           *berry*
 2  D   berry           0

我的原始代码是

# sort the data by user first and then by day
# choice.2 is the new column name
n<-nrow(dt) 
for (i in 1:n) {
 if (df$shopper[i]==dt$shopper[i+1]) 
{choice.2[i]<-choice[i+1]}
 else {choice.2[i]<-0}}

1 个答案:

答案 0 :(得分:1)

如果您的意思是要按购物者进行分组,然后引导Choice,请使用dplyr填充零,

library(dplyr)

df %>% group_by(Shopper) %>% mutate(choice2 = lead(as.character(Choice), default = '0'))
## Source: local data frame [8 x 4]
## Groups: Shopper [4]
## 
##     Day Shopper Choice choice2
##   <int>  <fctr> <fctr>   <chr>
## 1     1       A  apple   apple
## 2     2       A  apple       0
## 3     1       B Banana       0
## 4     1       C  apple  Banana
## 5     2       C Banana   apple
## 6     3       C  apple       0
## 7     1       D  berry   berry
## 8     2       D  berry       0 

或使用data.table,类似

library(data.table)

setDT(df)[, choice2 := shift(as.character(Choice), type = 'lead', fill = '0') , by = Shopper][]
##    Day Shopper Choice choice2
## 1:   1       A  apple   apple
## 2:   2       A  apple       0
## 3:   1       B Banana       0
## 4:   1       C  apple  Banana
## 5:   2       C Banana   apple
## 6:   3       C  apple       0
## 7:   1       D  berry   berry
## 8:   2       D  berry       0

或在基地,

df$choice2 <- ave(as.character(df$Choice), df$Shopper, FUN = function(x){c(x[-1], '0')})
df
##   Day Shopper Choice choice2
## 1   1       A  apple   apple
## 2   2       A  apple       0
## 3   1       B Banana       0
## 4   1       C  apple  Banana
## 5   2       C Banana   apple
## 6   3       C  apple       0
## 7   1       D  berry   berry
## 8   2       D  berry       0

如果Choice是一个因素,则所有版本都会将choice2强制转换为字符,这会带来一些时间惩罚。如果将"0"添加到因子级别,则相同的方法应该在没有强制的情况下工作。