说我的data.frame如下所述:
df<-as.data.frame(cbind("Home"=c("a","c","e","b","e","b"),
"Away"=c("b","d","f","c","a","f"))
df$Index<-rep(1,nrow(df))
Home Away Index
1 a b 1
2 c d 1
3 e f 1
4 b c 1
5 e a 1
6 b f 1
我想要做的是使用每个字符a - f的索引列计算累积总和,无论它们是Home
还是Away
列。因此,一个名为Cumulative_Sum_Home
的列,例如,在第6行的情况下取Home
行中的字符,“b”,并计算{b}中出现的“b”的次数所有先前行(包括第6行)中的{}或Home
列。因此,在这种情况下,b在前6行中累计出现3次,因此Away
给出值3.同样相同的逻辑适用于Cumulative_Sum_Home
列。在第5行,Away列中出现字符“a”,并且在该行的Home或Away列中累计出现2次,因此列Cumulative_Sum_Away
的值为2。
Cumulative_Sum_Away takes
我必须承认如何解决这个问题。我已经尝试过查看 Home Away Index Cumulative_Sum_Home Cumulative_Sum_Away
1 a b 1 1 1
2 c d 1 1 1
3 e f 1 1 1
4 b c 1 2 2
5 e a 1 2 2
6 b f 1 3 2
方法,但我之前从未使用过这个包,所以我无法立即看到如何解决它。任何提示都会受到极大的欢迎。
答案 0 :(得分:1)
有可能使这个更精简,但如果这对你来说不重要,那么这应该没问题。
NewColumns = list()
for ( i in sort(unique(c(levels(df[,"Home"]),levels(df[,"Away"]))))) {
NewColumnAddition = i == df$Home | i ==df$Away
NewColumnAddition[NewColumnAddition] = cumsum(NewColumnAddition[NewColumnAddition])
NewColumns[[i]] = NewColumnAddition
}
df$Cumulative_Sum_Home = sapply(
seq(nrow(df)),
function(i) {
NewColumns[[as.character(df[i,"Home"])]][i]
}
)
df$Cumulative_Sum_Away = sapply(
seq(nrow(df)),
function(i) {
NewColumns[[as.character(df[i,"Away"])]][i]
}
)
> df
Home Away Index HomeSum AwaySum
1 a b 1 1 1
2 c d 1 1 1
3 e f 1 1 1
4 b c 1 2 2
5 e a 1 2 2
6 b f 1 3 2
这是data.table
替代方案 -
setDT(df)
for ( i in sort(unique(c(levels(df[,Home]),levels(df[,Away]))))) {
df[, TotalSum := cumsum(i == Home | i == Away)]
df[Home == i, Cumulative_Sum_Home := TotalSum]
df[Away == i, Cumulative_Sum_Away := TotalSum]
}
df[,TotalSum := NULL]