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