Сохранение нечисловых столбцов при использовании combn в R - PullRequest
0 голосов
/ 16 мая 2018

У меня есть фрейм данных, похожий на следующий формат:

Doc Category val
A   aa        1
B   ab        6
C   ab        3
D   cc        6.....

Я использую следующий код для определения всех комбинаций сумм val, а затем извлекаю строки, которые составляют целевую сумму, которую я уже определил.

#all combinations
res <- Map(combn, list(val), seq_along(val), simplify = FALSE)
x=unlist(res, recursive = FALSE)
z=lapply(x, function(x) sum(x))

Моя проблема заключается в определении наилучшего способа сохранения символьных столбцов во фрейме данных, поскольку приведенный выше код дает только числовые значения. То, как я сейчас это делаю, - это отображение, основанное на val, которое обычно работает нормально, однако я могу столкнуться с проблемами при наличии дублированных значений.

Например, если моя целевая сумма равна 7, я в конечном итоге хочу вывод, который выглядит следующим образом (есть другие способы получить это значение, но пока просто работает первый экземпляр):

Doc Category val
A   aa        1
B   ab        6

Есть ли лучший способ сопоставления с нечисловыми столбцами для достижения этого результата?

1 Ответ

0 голосов
/ 17 мая 2018

Подойдет ли вам это решение:

df <- data.frame(Doc = LETTERS[1:7],
                 Category = c("aa","ab","ab","cc","ca","cb","bb"),
                 val = c(1,6,3, 6, 4, 5, 2), 
                 stringsAsFactors=FALSE)
df
#   Doc Category val
# 1   A       aa   1
# 2   B       ab   6
# 3   C       ab   3
# 4   D       cc   6
# 5   E       ca   4
# 6   F       cb   5
# 7   G       bb   2


target.sum=7

# create an "id" variable that is equal to the index of all rows
df$id <- seq_along(df$val)
id.res <- Map(combn, list(df$id), seq_along(df$id), simplify = FALSE)
x=unlist(id.res, recursive = FALSE)

#remove all elements in the list where the sum of 
# values in column val is not equal to target value
x.list <- lapply(x,FUN=function(x){ if(sum(df$val[x]) == target.sum ) df[x,] else NA})

#remove missing values
x.list <-x.list[!is.na(x.list)]

x.list
# [[1]]
#   Doc Category val id
# 1   A       aa   1  1
# 2   B       ab   6  2
# 
# [[2]]
#   Doc Category val id
# 1   A       aa   1  1
# 4   D       cc   6  4
# 
# [[3]]
#   Doc Category val id
# 3   C       ab   3  3
# 5   E       ca   4  5
# 
# [[4]]
#   Doc Category val id
# 6   F       cb   5  6
# 7   G       bb   2  7
# 
# [[5]]
#   Doc Category val id
# 1   A       aa   1  1
# 5   E       ca   4  5
# 7   G       bb   2  7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...