【问题标题】:Elegant matrix rows to list? [duplicate]要列出的优雅矩阵行? [复制]
【发布时间】:2017-01-21 11:18:26
【问题描述】:

有时我只想将索引或标签输入到 map* 类型的函数中,尤其是在最简单的解决方案是枚举所有可能组合的问题中。所以,我写了一个这样的表达式

x = expand.grid(paste0("A", 1:10), paste0("B", 1:10))

  Var1 Var2
1   A1   B1
2   A2   B1
3   A3   B1
4   A4   B1
5   A5   B1
6   A6   B1

现在,我想将每一行转换为一个带有丑陋 hack 的列表,例如

data.frame(t(x))

或者做这样的事情,这很烦人,因为输出是一个嵌套列表,需要另一个lapply 来修复。

apply(x, 1, list) 然后lapply(.Last.value, unlist)

必须有更优雅的方式来做到这一点吗?

【问题讨论】:

  • split(x, row(x)) 接近你想要的吗?

标签: r


【解决方案1】:

如果x 是题为问题的矩阵,我认为使用data.frame(t(x)) 并不是一个坏主意。另一方面,如果它是由expand.grid 生成的数据帧,则可以使用data.table 包中的transpose 函数,这优于t(x),因为t() 将数据帧强制转换为矩阵更改数据的底层存储模式并将其更改回可能非常低效的数据帧,而transpose 专为从?transpose 转置的列表、数据帧或数据表而设计:

转置是转置列表、数据帧或数据表的有效方法。

以下是一些关于转置数据框的基准:

microbenchmark::microbenchmark(data.frame(t(x)), data.table::transpose(x), split(x, 1:nrow(x)), lapply(apply(x, 1, list), unlist), times = 10)

# Unit: milliseconds
#                               expr        min         lq       mean     median         uq        max neval
#                   data.frame(t(x)) 114.061549 117.662053 121.628102 120.812289 125.132211 135.421358    10
#           data.table::transpose(x)   1.146525   1.400207   1.469908   1.467571   1.623157   1.736432    10
#                split(x, 1:nrow(x)) 160.550576 161.626339 187.385706 167.800102 179.647717 355.913319    10
#  lapply(apply(x, 1, list), unlist)   8.183313   8.379791   9.317694   8.783287   9.883049  12.345740    10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 2014-11-27
    • 2016-01-08
    • 2021-10-18
    • 1970-01-01
    • 2013-11-04
    相关资源
    最近更新 更多