-2

我有一个与此处描述的问题非常相似的问题:

data.frame 列的子集以最大化“完整”观察

我正在尝试安排一个会面五次的研讨会。我有十天的时间来选择会议日期,每天有三个重叠的可能会议时间。因此,我将 30 列分为十组(天),每组三列(会议时间)。我需要根据以下条件选择 5 列(或会议日期-时间组合):每天只选择一个会议时间(每组一列);可以参加所有 5 次会议的受访者(行)的数量最大化。理想情况下,如果我放宽受访者必须参加所有 5 次会议的标准,只要求他们参加 4 次或 3 次等,我还想知道最佳列选择如何变化。

对于简单的可视化,假设我想知道我应该选择哪两列——V1、V2 和 V3 中的每一个不超过一个——这样我就可以最大化没有零的行数(即行总和为 2)。

V1A   V1B   V1C   V2A   V2B   V2C   V3A   V3B   V3C  
1     0     1     0     1     1     1     0     1   
1     1     0     0     1     1     0     1     1   
0     0     1     1     1     0     0     1     1   
1     1     1     1     0     0     1     0     0 
1     0     0     0     1     1     0     1     0 
0     1     1     0     1     1     0     0     0 
1     0     1     1     1     0     1     0     1

实际数据在这里:https : //drive.google.com/file/d/0B03dE9-8088aMklOUVhuV3gtRHc/view 组是 mon1* tue1* [...] mon2* tue2* [...] fri2*。

如果不是我需要从组中选择列的情况,上面链接中提出的代码将解决我的问题。理想情况下,我还可以说明在行可能有一个零的较弱条件下(即行总和为 5 或 4 或 3 等),我应该选择哪些列以最大化行数。

非常感谢!

4

3 回答 3

1

您可以使用rowSums来获取大于或等于两个 1 的行的索引。(条件不是很清楚)

  lapply(split(names(df),sub('.$', '', names(df))), 
          function(x) which(rowSums(df[x])>=2))
  #$V1
  #[1] 1 2 4 6 7

  #$V2
  #[1] 1 2 3 5 6 7

  #$V3
  #[1] 1 2 3 7
于 2015-02-07T03:40:52.340 回答
0

这只是在三组中的每一组中找到具有 1 的第一列索引(或者如果全为零),返回一个三列矩阵,每组一列。

f <- substring(colnames(df), 1L, nchar(colnames(df))-1L)
ans <- lapply(split(as.list(df), f),
              function(x) max.col(do.call(cbind, x), ties.method="first"))
do.call(cbind, ans)
于 2015-02-07T06:21:26.000 回答
-2

使用您的数据集,这将提供满足提供所有行==1 要求的行:

> lapply( 1:3, function(grp) which( apply( dat[, grep(grp, names(dat))] , 1, 
                                           function(z) sum(z, na.rm=TRUE)==3) ) )
[[1]]
[1] 4

[[2]]
integer(0)

[[3]]
integer(0)

如果您放宽允许值小于 3 的要求,您将获得更多候选人:

> lapply( 1:3, function(grp) which( apply( dat[, grep(grp, names(dat))] , 1, function(z) sum(z, na.rm=TRUE)>=2) ) )
[[1]]
[1] 1 2 4 6 7

[[2]]
[1] 1 2 3 5 6 7

[[3]]
[1] 1 2 3 7

现在,,,,,,,这个任务的规则到底是什么??????

于 2015-02-07T03:14:20.180 回答