简短问题:我想将数据按行分组向上移动一行:在组内,第一行替换为第二行数据,第二行替换为第三行等。< 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}}
答案 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"
添加到因子级别,则相同的方法应该在没有强制的情况下工作。