获取分组数据的组合
Get combinations of grouped data
请告诉我正确的'r'方法。
我有 5 个地点。每天每个位置都会有 0 或 2 个值。我想按天获取可能的位置组合。下面的代码有效,但我认为它不是很好。有一个更好的方法吗?我已经尝试了很多不同的应用、聚合、熔化、铸造等变体。但这就是我所要做的全部工作。
请注意,在我的示例数据中,每个位置每天都有 2 个读数。但实际上一个位置每天会有 0 或 2 个读数,因此每天的组合可能不同。
d1 = rep(seq(as.Date("2015-01-01"), as.Date("2015-01-10"), by = "days"), each = 10)
v1 = round(runif(100, -300, 300))
results =
data.frame(
Date = d1,
Location = c(1:5),
Value = v1
)
dates = unique(lapply(results$Date, function(x) as.Date(x)))
process = function(d, c) {
x = results[(results$Date == d & results$Location %in% c), ]
print(x)
}
for (i in 1:length(dates)){
results.sub = results[as.Date(results$Date) == dates[i], ]
loc = unique(results.sub$Location)
for (m in 1:length(loc)){
combos = combn(loc,m)
for (c in 1:ncol(combos)){
process(dates[i],combos[,c])
}
}
}
我查看了很多其他 SO 答案,但找不到适合我的情况的答案。
感谢您的帮助。
期望的输出
如果当天报告了位置 1、2 和 3,那么那天我需要以下所有组合:
1
2
3
1 2
1 3
2 3
1 2 3
解决方案
在 Combinations by group in R 找到解决方案:
library(dplyr)
results %>% group_by(Date) %>% do(data.frame(t(combn(unique(.$Location), 5))))
这不是一个完整的解决方案,因为它只解决了组合中的 n 个项目,而不是 n 的所有可能性。不过这个跟下面的答案应该很接近了。
x = c(1,2,3) # your input
as.character(unlist(
lapply(1:length(x), function(m){
y = combn(x,m = m)
return(lapply(as.data.frame(y), paste, collapse = " "))
})
))
# [1] "1" "2" "3" "1 2" "1 3" "2 3" "1 2 3"
请告诉我正确的'r'方法。
我有 5 个地点。每天每个位置都会有 0 或 2 个值。我想按天获取可能的位置组合。下面的代码有效,但我认为它不是很好。有一个更好的方法吗?我已经尝试了很多不同的应用、聚合、熔化、铸造等变体。但这就是我所要做的全部工作。
请注意,在我的示例数据中,每个位置每天都有 2 个读数。但实际上一个位置每天会有 0 或 2 个读数,因此每天的组合可能不同。
d1 = rep(seq(as.Date("2015-01-01"), as.Date("2015-01-10"), by = "days"), each = 10)
v1 = round(runif(100, -300, 300))
results =
data.frame(
Date = d1,
Location = c(1:5),
Value = v1
)
dates = unique(lapply(results$Date, function(x) as.Date(x)))
process = function(d, c) {
x = results[(results$Date == d & results$Location %in% c), ]
print(x)
}
for (i in 1:length(dates)){
results.sub = results[as.Date(results$Date) == dates[i], ]
loc = unique(results.sub$Location)
for (m in 1:length(loc)){
combos = combn(loc,m)
for (c in 1:ncol(combos)){
process(dates[i],combos[,c])
}
}
}
我查看了很多其他 SO 答案,但找不到适合我的情况的答案。
感谢您的帮助。
期望的输出
如果当天报告了位置 1、2 和 3,那么那天我需要以下所有组合:
1
2
3
1 2
1 3
2 3
1 2 3
解决方案
在 Combinations by group in R 找到解决方案:
library(dplyr)
results %>% group_by(Date) %>% do(data.frame(t(combn(unique(.$Location), 5))))
这不是一个完整的解决方案,因为它只解决了组合中的 n 个项目,而不是 n 的所有可能性。不过这个跟下面的答案应该很接近了。
x = c(1,2,3) # your input
as.character(unlist(
lapply(1:length(x), function(m){
y = combn(x,m = m)
return(lapply(as.data.frame(y), paste, collapse = " "))
})
))
# [1] "1" "2" "3" "1 2" "1 3" "2 3" "1 2 3"