【问题标题】:Aggregate data from previous column with condition [closed]使用条件聚合上一列的数据[关闭]
【发布时间】:2018-07-03 05:05:06
【问题描述】:

我想汇总 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

【问题讨论】:

  • 你尝试了什么?你从哪里得到堆栈?
  • @sotos 他可能已经溢出了。主题:数据的结构非常混乱。将一些实际数据放入其中。
  • 您能解释一下您的 v5 和 v6 专栏吗?

标签: r aggregation


【解决方案1】:

我花了一段时间才弄清楚 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 保持不变相同。

【讨论】:

    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 2018-03-14
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多