我遇到的问题与此处描述的问题非常相似:
subset of data.frame columns to maximize "complete" observations
我正在安排一次将举行五次会议的研讨会。我有十天的时间来选择会议日期,每天有三个重叠的可能会议时间。因此,我有30列分为10组(天),每列有三列(会议时间)。我需要根据以下标准选择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等)。
非常感谢!
答案 0 :(得分: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
答案 1 :(得分: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)
答案 2 :(得分:-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
现在,,,,,,,这个任务到底是什么??????