将列表结果重新分配到数据框 r
Reallocate list results into data frame r
我根据其他列的函数对数据框中一列的所有值进行了采样。为此,我使用 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 <- 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))))
如果我理解你的问题,你可以用 dplyr
:
library(dplyr)
ex %>%
group_by(loc) %>%
mutate(sp_random = sample(levels(sp), n()))
我们可以试试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]
我根据其他列的函数对数据框中一列的所有值进行了采样。为此,我使用 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 <- 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))))
如果我理解你的问题,你可以用 dplyr
:
library(dplyr)
ex %>%
group_by(loc) %>%
mutate(sp_random = sample(levels(sp), n()))
我们可以试试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]