我尝试在 Dataframe df
中循环函数f
,并将输出存储在result中。该函数对v
中的值进行采样,并将其存储在v. sample中。但是,我希望该函数仅进行循环,从而对v进行采样,同时将m保持在同一物种sp
中
set.seed(100)
x <- c(1,1,1,1,1,1,2,3,4,5,11,11,11,11,11,500,782,234,124,566)
v <- c(1,1,1,1,1,1,2,3,4,5,11,11,11,11,11,60,80,123,44,55)
sp <- rep(c("A", "B", "C", "D"), each=5)
df <- data.frame(x, v, sp)
df$sp <- as.factor(df$sp)
library(data.table)
setDT(df)
f <- function(x, v) {
v.sample <- sample(v, length(v), replace=TRUE)
y.sample <- (v.sample/x^2) - (1/x)
per <- cor(y.sample, x, use="complete.obs")
# storing all vectors in a dataframe
data.frame( v.sample = v.sample, y.sample = y.sample, rand.cor = per)
}
result <- rbindlist(
lapply(1:9, \(i) df[, .(f(x, v),x,v, sp)][, i:=i])
)
目前,v.sample在所有物种之间移动,例如,在我设置虚拟数据集的方式中,sp == A
的v.sample必须仅为1;而sp == D
必须在44 and 123
之间变化,目前,它在所有物种sp
之间移动
2条答案
按热度按时间pnwntuvh1#
我们可以对数据进行
split
,然后在每个sp
上运行UDF,并将结果 Package 为rbindlist
。也许有一种方法使用组by
,但我想不出来。46scxncf2#
如果你对使用dplyr的解决方案感兴趣,那么我认为这就是你所概述的:
请注意,按照您设置数据的方式,
cor()
会由于常量数据而抛出大量警告,因此您得到的sd为零。