2015-02-07 4 views
-3

У меня есть проблема, очень похожий на описанный здесь:R подмножество data.frame столбцов по группам, чтобы максимизировать ряд значений

subset of data.frame columns to maximize "complete" observations

Я пытаюсь запланировать семинар, который будет отвечать в пять раз. У меня есть десять дней, из которых можно выбрать даты встреч, каждый день с тремя перекрывающимися возможными встречами. Следовательно, у меня есть 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 и т. Д.).

Большое спасибо!

ответ

-1

С набором данными это обеспечивает те строки, которые удовлетворяют требование, чтобы доставить все строки == 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 

Теперь ,,,,,,, то, что именно являются правилами для этой задачи ?????

1

Вы можете использовать rowSums, чтобы получить индекс строк, который больше или равен двум единицам. (Условия не очень ясны)

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 
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) 
Смежные вопросы