【问题标题】:Reallocate list results into data frame r将列表结果重新分配到数据框 r
【发布时间】:2015-12-16 13:20:25
【问题描述】:

我根据另一列的功能对我的数据框的一列的所有值进行了抽样。为此,我使用tapply

ex <- data.frame(
loc = c("1", "1", "2", "2", "2", "3", "3"),
sp = c("a", "b", "b", "c", "d", "a", "d"))
ex

all_sp <- unique(ex[, "sp"])
all_sp <- data.frame(all_sp)

ex$sp_random <- ""

sp_rand <- tapply(ex$sp_random, ex$loc, function(x) 
base::sample(all_sp$all_sp, size = length(x), replace = FALSE, prob = NULL))

现在我想将sp_rand 列表放入原始ex 数据框中,但我不知道如何正确操作。

我发现的唯一方法是像这样重新排序ex 列:

ex <- ex[order(ex$loc), ]
ex$sp_random <- as.character(unlist(sp_rand))
ex

但是order 处理大数据帧时速度很慢。

【问题讨论】:

  • 您的问题/问题到底是什么?
  • 我希望在我的原始数据框ex 中得到sp_rand 结果。但是tapply给了我一个列表,我找不到有效的方法把它放回原始数据框中。

标签: r list tapply


【解决方案1】:

我们可以试试data.table。我们将 'data.frame' 转换为 'data.table' (setDT(ex)),按 'loc' 分组,我们得到 levels(sp)sample 并将 (:=) 分配给 'sp_random'。

library(data.table)
setDT(ex)[, sp_random := sample(levels(sp), .N),by = loc]

【讨论】:

    【解决方案2】:

    如果我理解您的问题,您可以使用dplyr

    library(dplyr)
    ex %>%
      group_by(loc) %>%
      mutate(sp_random = sample(levels(sp), n()))
    

    【讨论】:

      【解决方案3】:

      我可能不明白你的问题,但你为什么不这样做:

      ex <- data.frame(loc = c("1", "1", "2", "2", "2", "3", "3"),
          sp = c("a", "b", "b", "c", "d", "a", "d"))
      
      spz <- unique(ex$sp)
      ex$sp_random <- unlist(tapply(ex$sp, ex$loc, function(x) sample(spz,length(x))))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-24
        • 2012-09-12
        • 2018-01-03
        • 2021-07-29
        • 2022-11-17
        • 1970-01-01
        • 1970-01-01
        • 2021-07-05
        相关资源
        最近更新 更多