Объединение Dataframes в списке двумя столбцами «i» и «j» для проведения статистического анализа - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть список из 366 фреймов данных, каждый DG содержит 3 столбца, т.е. «Я», «J» и «Значение». Я хочу объединить эти фреймы данных в один фрейм данных, чтобы выполнить статистический анализ, например, среднее значение, режим, медиана. каждый список содержит почти одинаковое нет. наблюдения?

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Варианты Base R:

set.seed(42)
listdat <- replicate(3, data.frame(i=sample(100, size=2), j=sample(100, size=2), Value=sample(100, size=2)), simplify = FALSE)
str(listdat)
# List of 3
#  $ :'data.frame': 2 obs. of  3 variables:
#   ..$ i    : int [1:2] 92 93
#   ..$ j    : int [1:2] 29 83
#   ..$ Value: int [1:2] 65 52
#  $ :'data.frame': 2 obs. of  3 variables:
#   ..$ i    : int [1:2] 74 14
#   ..$ j    : int [1:2] 66 70
#   ..$ Value: int [1:2] 46 72
#  $ :'data.frame': 2 obs. of  3 variables:
#   ..$ i    : int [1:2] 94 26
#   ..$ j    : int [1:2] 47 94
#   ..$ Value: int [1:2] 98 12

Начиная с этого, первое, что мы можем сделать, это просто объединить их по строкам, все в одном go:

do.call(rbind, listdat)
#    i  j Value
# 1 92 29    65
# 2 93 83    52
# 3 74 66    46
# 4 14 70    72
# 5 94 47    98
# 6 26 94    12

Было бы неплохо указать, с какого индекса они пришли. Если они не названы, то вы можете просто включить индексный номер:

do.call(rbind, Map(cbind, listdat, num=seq_along(listdat)))
#    i  j Value num
# 1 92 29    65   1
# 2 93 83    52   1
# 3 74 66    46   2
# 4 14 70    72   2
# 5 94 47    98   3
# 6 26 94    12   3

Если у них есть имена, однако, мы можем использовать ту же технику:

names(listdat) <- c("A","B","C")
do.call(rbind, Map(cbind, listdat, name=names(listdat)))
#      i  j Value name
# A.1 92 29    65    A
# A.2 93 83    52    A
# B.1 74 66    46    B
# B.2 14 70    72    B
# C.1 94 47    98    C
# C.2 26 94    12    C

Per @ akrun's предложение с комментариями, вот два предложения внешнего пакета, которые немного короче.

# 'dplyr'
dplyr::bind_rows(listdat)                      # if no names present
dplyr::bind_rows(listdat, .id = 'name')        # with names
# 'data.table'
data.table::rbindlist(listdat)                 # if no names present
data.table::rbindlist(listdat, idcol = 'name') # with names
0 голосов
/ 18 февраля 2020

Предполагая, что наборы данных находятся в вашем рабочем каталоге и имеют некоторый уникальный идентификатор в имени файла (например, "dataset": "dataset1.csv", "dataset2.csv", "dataset3.csv", et c ... ), и вы не возражаете против использования tidyverse, должно работать следующее:

library(tidyverse)

file_names <- list.files() %>%
   str_extract(., "dataset")

my_df <- map(file_names, ~ read_csv(.x)) %>% bind_rows()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...