#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