将列表结果重新分配到数据框r中

时间:2015-12-16 13:20:25

标签: r list tapply

我在其他列的功能中对我的数据框的一列的所有值进行了采样。为此,我使用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对于大数据帧来说速度很慢。

3 个答案:

答案 0 :(得分:1)

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

执行此操作
library(dplyr)
ex %>%
  group_by(loc) %>%
  mutate(sp_random = sample(levels(sp), n()))

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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))))