【问题标题】:Convert dataframe with A and B columns into list of As with list of unique B values将具有 A 和 B 列的数据框转换为具有唯一 B 值列表的 As 列表
【发布时间】:2023-03-21 03:35:02
【问题描述】:

我有一个像这样的大型 data.frame:

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

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】:

    split 应该更快

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

    如果打算让'key'、'value'都唯一,

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

    或者

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

    【讨论】:

    猜你喜欢
    • 2018-06-20
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    相关资源
    最近更新 更多