我的数据集包含两个因素:Environments
(4个级别),Individuals
(每个环境中500个)和响应变量YD
。作为我分析的一部分,我必须以下列方式从每个环境中随机抽取100个人:
我已经使用几行代码解决了这个问题,但是我希望有人会帮我生成一个R函数来做到这一点,这在其他情况下非常有用。
以下是具有类似结构的示例数据集:
library(BLR)
data (wheat)
Data <- melt(Y)
colnames(Data) <- c('Individuals','Environments','YD')
答案 0 :(得分:1)
更新回答:
我把答案包裹在一个函数中。请注意,这仅适用于4个级别。
colnames(Data)<-c("Individuals","Environments","YD") #removed spaces from names
myfun <- function(DF, samplefrom, samplelevels, sampletype, samplesize)
{
if(sampletype == "per1")
{
Env1 = sample(unique(DF[[samplefrom]]), samplesize)
Env2 <- Env3 <- Env4 <- Env1
}
if(sampletype == "per4")
{
Env1 = sample(unique(DF[[samplefrom]]), samplesize)
Env2 = sample(unique(DF[[samplefrom]])[!unique(DF[[samplefrom]]) %in% Env1], samplesize)
Env3 = sample(unique(DF[[samplefrom]])[!unique(DF[[samplefrom]]) %in% c(Env1, Env2)], samplesize)
Env4 = sample(unique(DF[[samplefrom]])[!unique(DF[[samplefrom]]) %in% c(Env1, Env2, Env3)], samplesize)
}
if(sampletype == "per2")
{
Env1 = sample(unique(DF[[samplefrom]]), samplesize)
Env2 <- Env1
Env3 = sample(unique(DF[[samplefrom]])[!unique(DF[[samplefrom]]) %in% Env1], samplesize)
Env4 <- Env3
}
ret = do.call(rbind, mapply(function(ind, env) {df <- Data[DF[[samplelevels]] == env,];
df[df[[samplefrom]] %in% ind,]},
env = as.list(sample(unique(DF[[samplelevels]]))), ind = list(Env1, Env2, Env3, Env4),
SIMPLIFY = F)) #in `env = ` added `sample` to select the environments
#in random order and assign them the individuals
return(ret)
}
myfun(Data, "Individuals", "Environments", "per1", 2)
# Individuals Environments YD
#21 13954 1 0.6658681
#345 457982 1 -1.1022770
#620 13954 2 -0.4888968
#944 457982 2 0.6026167
#1219 13954 4 -0.7183965
#1543 457982 4 0.4881141
#1818 13954 5 0.2660623
#2142 457982 5 -2.0626073
myfun(Data, "Individuals", "Environments", "per2", 2)
# Individuals Environments YD
#25 15292 1 -1.1272386
#248 373045 1 -0.6659416
#624 15292 2 -0.2362053
#847 373045 2 0.5778210
#1260 62150 4 1.2077921
#1654 1541043 4 1.1406084
#1859 62150 5 -0.3358584
#2253 1541043 5 0.3897426
myfun(Data, "Individuals", "Environments", "per4", 2)
# Individuals Environments YD
#106 85786 1 1.4480500
#567 3830162 1 -1.8052577
#1029 1301802 2 0.2737786
#1043 1410845 2 1.0617118
#1630 1302304 4 0.6673241
#1678 1766332 4 -0.0451913
#1871 65315 5 -0.0597450
#2336 2621166 5 2.5590801
更新2 一些评论
mapply
将函数顺序应用于多个参数。这里,该函数有两个参数:ind
和env
。函数1)将数据帧设置为env
,并将子集化数据的子集设置为ind
。 env
是一个环境,ind
是先前在Env1
中计算的个人(myfun
,...)的样本。函数mapplied
的多个参数是env
:[1,2,3,4]和ind
:[Env1,Env2,Env3,Env4]。 mapply
按顺序env = 1
和ind = Env1
,env = 2
和ind = Env2
等,并在列表中提供结果(必要的子集)。 do.call(rbind,)
在数据框输出中加入列表。
P.S。请注意,因为使用sample
env
可以是[1,2,3,4]或[2,4,3,1]或其他什么,所以函数的顺序组合(将{ {1}})参数不仅是mapplied
和env = 1
,还有ind = Env1
和env = 1 or 2 or 3 or 4
,依此类推。
使用不同的无级别更新3和4 功能
ind = Env1
是您希望采用的不同样本的数量;我将其默认为No_different_samples
的数量(即每个级别的不同样本)。如果samplelevels
不适合无级别(即如果你想要4个级别的人口中的3个不同样本(作为你的No_different_samples
),我的函数会给出一个错误,它会抛出一个错误;您必须选择1或2或4.
Data