我想知道是否有人可以帮我计算分组的第一个分数差异。我知道这应该是一个简单的过程,但出于某种原因我无法做到这一点......哎呀
以下是一个示例数据框:
score <- c(10,30,14,20,6)
group <- c(rep(1001,2),rep(1005,3))
df <- data.frame(score,group)
> df
score group
1 10 1001
2 30 1001
3 14 1005
4 20 1005
5 6 1005
这是我正在寻找的输出。
1 NA
2 20
3 NA
4 6
5 -14
提前致谢。
答案 0 :(得分:11)
这是使用基础R
的一种方式df$diff <- unlist(by(df$score , list(df$group) , function(i) c(NA,diff(i))))
或
df$diff <- ave(df$score , df$group , FUN=function(i) c(NA,diff(i)))
或者使用data.table - 这对于更大的data.frames来说会更有效
library(data.table)
dt <- data.table(df)
setkey(dt,group)
dt[,diff:=c(NA,diff(score)),by=group]
答案 1 :(得分:5)
使用dplyr的另一种方法:
library(dplyr)
score <- c(10,30,14,20,6)
group <- c(rep(1001,2),rep(1005,3))
df <- data.frame(score,group)
df %>%
group_by(group) %>%
mutate(first_diff = score - lag(score))
答案 2 :(得分:1)
虽然不完全符合您的要求,但可以使用“plyr”包中的ddply ta按组计算差异
library(plyr)
out<-ddply(df,.(group),summarize,d1=diff(score,1))
答案 3 :(得分:0)
这应该可以解决问题,虽然它使用循环而不是应用函数,因此代码清晰度/效率可能有提升空间
out = numeric()
#out[1] will always be NA
out[1] = NA
for(i in 2:nrow(df)){
if(df$group[i]==df$group[(i-1)]){
out[i]=df$score[i]-df$score[(i-1)]
}
else {
out[i]=NA
}
}
out
[1] NA 20 NA 6 -14