获取分组数据的组合

时间:2017-02-10 00:40:37

标签: r combn

请告诉我正确的' 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的所有可能性。但下面的答案应该非常接近。

1 个答案:

答案 0 :(得分:1)

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"