Суммирование строк по выбранным столбцам, указанным символьной строкой в ​​R - PullRequest
0 голосов
/ 21 февраля 2020

Что у меня есть: Большой файл из 1451 строк и 4663 столбцов со значениями 0, 1 и NA. Имена строк представляют собой сайты, а в столбцах - дату проведения опроса. Я хотел бы суммировать строки, используя указанные c интервалы дат, то есть суммировать определенные c столбцы, относящиеся к имени столбцов, которые представляют даты. В этом случае у меня есть 666 различных интервалов дат для суммирования строк. Указанные интервалы c даны в символе типа объекта.

Коротким воспроизводимым примером будет:

    df <- read.table(text ="     2005-09-23  2005-09-24  2005-09-25  2005-09-26    2005-09-27  2005-09-28  2005-09-29  2005-09-30  2005-10-07  2005-10-08
1  0       0     1    NA    1       0     1    NA   1   0          
2  1       1     1    1     1       1     1    1    1   1    
3  NA      NA    NA   NA    NA      NA    NA   NA   NA  NA", header = TRUE)

И строка символов с именами столбцов для суммирования, то есть дата интервалы, с начальной и конечной датами, разделенными "_":

intervals <- c("2005-09-23_2005-09-26", "2005-09-27_2005-10-30", "2005-10-07_2005-10-08")

Что я хочу: Фрейм данных с именами столбцов, которые отражают интервалы дат, сайты в строках и в ячейках сумма суммируемых значений. Важно иметь в суммах NA, в которых все значения равны NA.

result <- read.table(text ="     2005-09-23_2005-09-26  2005-09-27_2005-10-30  2005-10-07_2005-10-08
1  1       2     1           
2  4       4     2     
3  NA      NA    NA", header = TRUE)

Моя проблема: Я не знаю, как указать набор интервалов столбцов с использованием столбца имена. Я нашел здесь полезную информацию, связанную с моей проблемой, но все они требуют указания вручную столбцов, по которым нужно сложить сумму, например, df_sum <- rowSums(df [,c(1:3)]), что в моем случае будет 666 интервалами дат. Я думаю, что ответ где-то в следующем посте и с использованием команды rowSums, однако я не могу понять, как адаптировать эти проблемы к моим. Как получить rowSums для выбранных столбцов в R и Суммировать строки в data.frame или матрице и Суммировать строки по интервалу Dataframe и R - Как суммировать объекты в столбце между интервалами, заданными условиями в другом столбце

Я не слишком разбираюсь в этом, кто-то может быть настолько любезен, чтобы предоставить мне код для этого? Спасибо!

1 Ответ

0 голосов
/ 21 февраля 2020

Мы конвертируем имена столбцов класса 'df' в класс Date, затем разделяем вектор 'интервалов' в _ на векторы list, используем операторы сравнения с 'v1' для создания логического vector, поднабор столбцов 'df' на основе этого и получение rowSums, наконец, cbind list элементов

v1 <-  as.Date(names(df), "X%Y.%m.%d")
out <- do.call(cbind.data.frame, lapply(strsplit(intervals, "_"), function(x){
     tmp <- df[v1 >= x[1] & v1 <= x[2]]
     NA^(!rowSums(!is.na(tmp)))* rowSums(tmp, na.rm = TRUE)
  }))
colnames(out) <- intervals
out
#  2005-09-23_2005-09-26 2005-09-27_2005-10-30 2005-10-07_2005-10-08
#1                     1                     3                     1
#2                     4                     6                     2
#3                    NA                    NA                    NA
...