Разрезание файла CSV на разные столбцы с помощью R
Это дополнительный вопрос к Pivoting CSV-файла с использованием R.
В этом вопросе я хотел разрезать один столбец (тип) на несколько столбцов, основываясь на значениях в столбце (repository_name). Были использованы следующие входные данные.
type created_at repository_name
1 IssuesEvent 2012-03-11 06:48:31 bootstrap
2 IssuesEvent 2012-03-11 06:48:31 bootstrap
3 IssueCommentEvent 2012-03-11 07:03:57 bootstrap
4 IssueCommentEvent 2012-03-11 07:03:57 bootstrap
5 IssueCommentEvent 2012-03-11 07:03:57 bootstrap
6 IssuesEvent 2012-03-11 07:03:58 bootstrap
7 WatchEvent 2012-03-11 07:18:45 hogan.js
8 WatchEvent 2012-03-11 07:18:45 hogan.js
9 WatchEvent 2012-03-11 07:18:45 hogan.js
10 IssueCommentEvent 2012-03-11 07:03:57 bootstrap
Полный файл CSV доступен по https://github.com/aronlindberg/VOSS-Sequencing-Toolkit/blob/master/twitter_exploratory_analysis/all_events.csv.
Вот dput() первых 30 строк CSV:
structure(list(type = structure(c(3L, 3L, 3L, 3L, 3L, 3L, 2L,
2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 1L, 1L,
1L, 4L, 4L, 4L, 2L, 2L, 2L), .Label = c("ForkEvent", "IssueCommentEvent",
"IssuesEvent", "WatchEvent"), class = "factor"), created_at = structure(c(1L,
1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L,
6L, 7L, 7L, 7L, 8L, 8L, 8L, 9L, 9L, 9L, 10L, 10L, 10L), .Label = c("2012-03-11 06:48:31",
"2012-03-11 06:52:50", "2012-03-11 07:03:57", "2012-03-11 07:03:58",
"2012-03-11 07:15:44", "2012-03-11 07:18:45", "2012-03-11 07:19:01",
"2012-03-11 07:23:56", "2012-03-11 07:32:43", "2012-03-11 07:38:52"
), class = "factor"), repository_name = structure(c(1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L,
1L, 1L, 1L, 1L, 1L, 3L, 3L, 3L, 1L, 1L, 1L), .Label = c("bootstrap",
"hogan.js", "twemproxy"), class = "factor")), .Names = c("type",
"created_at", "repository_name"), class = "data.frame", row.names = c(NA,
-30L))
На этот вопрос хорошо ответил @flodel, который предложил этот код.
data.split <- split(events.raw$type, events.raw$repository_name)
data.split
list.to.df <- function(arg.list) {
max.len <- max(sapply(arg.list, length))
arg.list <- lapply(arg.list, `length<-`, max.len)
as.data.frame(arg.list)
}
df.out <- list.to.df(data.split)
df.out
Тем не менее, теперь я хотел бы отсортировать список так, чтобы события (тип) для каждого репо (repository_name) упорядочивались в столбце каждый месяц (как извлечено из столбца "create_at") следующим образом:
bootstrap_2012_03 bootstrap_2012_04 hogan.js_2012_03
1 IssuesEvent PushEvent PushEvent
2 IssuesEvent IssuesEvent IssuesEvent
3 OssueCommentEvent WatchEvent IssuesEvent
Некоторые другие предположения:
- Отметки времени предназначены только для заказа и не требуют синхронизации по ряду.
- Даже если "IssuesEvent" повторяется 10 раз, мне нужно сохранить все это, так как я буду выполнять анализ последовательности с использованием пакета R TraMineR
- Колонны могут быть неравной длины
- Нет связи между столбцами для разных репозиториев ("repository_name")
- Данные за разные месяцы одного и того же хранилища полностью независимы
Как я могу сделать это в R?
1 ответ
Вместо расщепления по repository_name
столбец, сначала создайте новый столбец, который объединяет repository_name
и месяц:
events.raw$month <- format(as.Date(events.raw$created_at), "%Y_%m")
events.raw$repo.month <- paste(events.raw$repository_name,
events.raw$month, sep = "_")
head(events)
# type created_at repository_name month repo.month
# 1 IssuesEvent 2012-03-11 06:48:31 bootstrap 2012_03 bootstrap_2012_03
# 2 IssuesEvent 2012-03-11 06:48:31 bootstrap 2012_03 bootstrap_2012_03
# 3 IssuesEvent 2012-03-11 06:48:31 bootstrap 2012_03 bootstrap_2012_03
# 4 IssuesEvent 2012-03-11 06:52:50 bootstrap 2012_03 bootstrap_2012_03
# 5 IssuesEvent 2012-03-11 06:52:50 bootstrap 2012_03 bootstrap_2012_03
# 6 IssuesEvent 2012-03-11 06:52:50 bootstrap 2012_03 bootstrap_2012_03
Затем используйте тот же метод, который я предложил в прошлый раз:
data.split <- split(events.raw$type, events.raw$repo.month)
list.to.df <- function(arg.list) {
max.len <- max(sapply(arg.list, length))
arg.list <- lapply(arg.list, `length<-`, max.len)
as.data.frame(arg.list)
}
df.out <- list.to.df(data.split)
head(df.out)
# bootstrap_2012_03 hogan.js_2012_03 twemproxy_2012_03
# 1 IssuesEvent WatchEvent WatchEvent
# 2 IssuesEvent WatchEvent WatchEvent
# 3 IssuesEvent WatchEvent WatchEvent
# 4 IssuesEvent <NA> <NA>
# 5 IssuesEvent <NA> <NA>
# 6 IssuesEvent <NA> <NA>