根据条件汇总上一列的数据
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 保持不变相同。
我想汇总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 保持不变相同。