将具有A和B列的数据帧转换为具有唯一B值列表的As列表

问题描述 投票:2回答:1

我有一个大的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

编辑

我以前写过,列出具有65k行的data.frame大约需要10分钟。今天我意识到,几乎所有的时间都是我上面没有显示的lapply循环中的另一个步骤。

下面的akrun解决方案仍然更快,更优雅!

r list dataframe unique
1个回答
1
投票

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))
© www.soinside.com 2019 - 2024. All rights reserved.