根据条件汇总上一列的数据

Aggregate data from previous column with condition

我想汇总John和Joshua的消费积分,最新事件是当前更新的积分。

输入数据:

v1 = c("event1", "event2", "event3")
v2 = c("garlicX", "onionY", "cucumberX")
v3 = c("John", "John", "John")
v4 = c("Joshua", "Joshua", "Joshua")

#John's table points
x1 = c("garlicJohn", "OnionJohn", "CucumberJohn")
x2 = c(1, 2, 3)

#Joshua's table points
x3 = c("garlicJoshua", "OnionJoshua", "CucumberJoshua")
x4 = c(1, 2, 3)


df0 = data.frame(x1,x2,x3,x4)
df1 = data.frame(v1,v2,v3,v4)

期望的输出:

#v5 John's aggregate score
#v6 Joshua's aggregate score

    v1        v2    v3     v4   v5 v6
event1   garlicJohn John Joshua  1  0
event2  onionJoshua John Joshua  1  2
event3 cucumberJohn John Joshua  4  2

我花了一些时间来计算 v5 和 v6 列。此外,我注意到不一致的事实是,x1 和 x3 的洋葱和黄瓜以大写字母开头,我将其更改为小写字母。这可能不是最好的解决方案,但你可以这样做:

v1 = c("event1", "event2", "event3")
v2 = c("garlicX", "onionY", "cucumberX")
v3 = c("John", "John", "John")
v4 = c("Joshua", "Joshua", "Joshua")

df1 = data.frame(v1, v2, v3, v4, stringsAsFactors = FALSE)

x1 = c("garlicJohn", "onionJohn", "cucumberJohn")
x2 = c(1, 2, 3)
x3 = c("garlicJoshua", "onionJoshua", "cucumberJoshua")
x4 = c(1, 2, 3)

df0 = data.frame(x1, x2, x3, x4, stringsAsFactors = FALSE)

forJohn <- 'X'
forJoshua <- 'Y'

for(i in 1:3) {
  if(grepl(forJohn, df1$v2[i])) {
    str1 <- strsplit(df1$v2[i], forJohn)
    str2 <- 'John'
    df1$v2[i] <- paste0(str1, str2)
  } else if(grepl(forJoshua, df1$v2[i])) {
    str1 <- strsplit(df1$v2[i], forJoshua)
    str2 <- 'Joshua'
    df1$v2[i] <- paste0(str1, str2)
  }
}

for(i in 1:3) {
  if(grepl(df1$v2[i], df0$x1[i])) {
    if(i == 1) {
      df1$v5[i] <- i
    } else{
      df1$v5[i] <- i + df1$v5[i-1]
    }
  } else {
    if(i == 1) {
      df1$v5[i] <- 0
    } else {
      df1$v5[i] <- df1$v5[i-1]
    }
  }
}

for(i in 1:3) {
  if(grepl(df1$v2[i], df0$x3[i])) {
    if(i == 1) {
      df1$v6[i] <- i
    } else{
      df1$v6[i] <- i + df1$v6[i-1]
    }
  } else {
    if(i == 1) {
      df1$v6[i] <- 0
    } else {
      df1$v6[i] <- df1$v6[i-1]
    }
  }
}

结果:

      v1           v2   v3     v4 v5 v6
1 event1   garlicJohn John Joshua  1  0
2 event2  onionJoshua John Joshua  1  2
3 event3 cucumberJohn John Joshua  4  2

编辑:如果有人想知道 v5 和 v6 是如何计算的。这是解释。

garlicJohn 和 garlicJoshua 映射到 1,同样,onionJohn、onionJosha、cucumberJohn 和 cucumberJoshua 分别映射到 2、2、3 和 3。

现在,我们需要从 df1 的 v2 列中检查 df0 数据帧的值是什么。 garlicJohn 对应于 1。v5 需要聚合基于 John 的值,而 v6 则基于 Joshua。因此,garlicJohn 对于 v5 为 1,对于 v6 为 0。我们现在有 onionJosha,这意味着 v5 第二行保持原样,而 v6 第二行变为 2。对于最后一行,在 v5 中,我们将当前映射值添加到先前索引 (3 + 1) 的值,而 v6 保持不变相同。