вычислить сумму столбцов для списка в r

#r

Вопрос:

Я поместил все свои файлы в папку и использую следующее, чтобы прочитать ее

 filenames <- list.files(pattern = ".csv")

all <- lapply(filenames, function(name) {
  readr:: read_csv(name)
})
 

Затем я извлекаю имена столбцов, необходимые для дальнейшего анализа

 my_names <-  c("ID", "tt","dd")

new_list <-  lapply(all, "[", , my_names)
 

Список выглядит примерно так

 $(tt=c(1,2,3), dd=c(4,7,9), ID=c("a","a","a"))
$(tt=c(5,5,10), dd=c(10,10,10),ID=c("b","b","b"))
 

Меня интересует вычисление суммы столбца tt , dd а затем сохранение его в csv-файле. Это должно выглядеть так

 tt  dd  ID
6   20  a
20  30  b
 

Для одного фрейма данных я могу использовать sum(df$dd,na.rm = T), но как я могу сделать это для списка? Спасибо.

Ответ №1:

Я бы просто прошелся по списку:

 tt = c()
dd = c()
ID = c()
for(i in 1:length(list)){
    tt=c(tt,sum(list[[i]]$tt))
    dd=c(dd,sum(list[[i]]$dd))
    ID=c(ID,sum(list[[i]]$ID))
}

sums = data.frame(tt,dd,ID)

 

Но в R. может быть более элегантный способ.

Ответ №2:

одним из вариантов в tidyverse (в данном случае dplyr и purrr) может быть следующее:

 library(tidyverse)


# dummy data
dd <- list(data.frame(tt=c(1,2,3), dd=c(4,7,9), ID=c("a","a","a")),
           data.frame(tt=c(5,5,10), dd=c(10,10,10),ID=c("b","b","b")))
# use map func
purrr::map(dd, ~ .x %>% 
  # group by the ID column
  dplyr::group_by(ID) %>% 
  # sum all numeric columns (you could just specify the columnnames aswell)
  dplyr::summarise(across(where(is.numeric), sum)))

[[1]]
# A tibble: 1 x 3
  ID       tt    dd
  <chr> <dbl> <dbl>
1 a         6    20

[[2]]
# A tibble: 1 x 3
  ID       tt    dd
  <chr> <dbl> <dbl>
1 b        20    30