r数据帧中包含相同值的多个列的累积和条件

时间:2015-11-13 01:38:15

标签: r

说我的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 方法,但我之前从未使用过这个包,所以我无法立即看到如何解决它。任何提示都会受到极大的欢迎。

1 个答案:

答案 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]