Конвертировать фрейм данных со столбцами A и B в список As со списком уникальных значений B - PullRequest
2 голосов
/ 17 апреля 2020

У меня есть большой data.frame, подобный этому:

+--------+---------+
| A      | B       |
+--------+---------+
| USA    | Chicago |
+--------+---------+
| USA    | Chicago |
+--------+---------+
| France | Paris   |
+--------+---------+
| Italy  | Rome    |
+--------+---------+
| France | Nice    |
+--------+---------+
| Italy  | Venice  |
+--------+---------+

ie

AB <- structure(list(A = c("USA", "France", "Italy", "France", "Italy", 
"USA"), B = c("Chicago", "Paris", "Rome", "Nice", "Venice", "Chicago"
)), row.names = c(NA, -6L), class = "data.frame")

, и я хотел бы создать такой список:

list(USA = list("Chicago"), France = list("Paris", "Nice"), Italy = list(
    "Rome", "Venice"))

Вот что я сейчас делаю.

unique.As <- unique(AB$A)
ABL <- lapply(unique.As, function(current.A) {
  return(unique(AB$B[AB$A == current.A]))
})
names(ABL) <- unique.As

Редактировать

Ранее я писал, что обработка файла data.frame с 65k строками заняла ~ 10 минут. Сегодня я осознал, что почти все это время было из другого шага в том счастливом l oop, который я не показывал выше.

Решение Акруна ниже еще быстрее и элегантнее!

1 Ответ

1 голос
/ 17 апреля 2020

split должно быть быстрее

lst1 <- split(as.list(AB$B), AB$A)

Если намерение состоит в том, чтобы оба ключа имели уникальное значение,

lst1 <- with(unique(AB), split(as.list(B), A))

Или

with(AB[!duplicated(AB), ], split(as.list(B), A))
...