我准备一个具有临时数据帧的函数,但是当我将此函数应用于旧数据帧时,该临时数据帧为空。我该如何解决?
我尝试了以下代码:
data_a <- as.data.frame(cbind(pop=c("a1","b2","c3","d4","d5"),
PA1=c(1,40,430,4330,43330),
PA2=c(2,50,530,5330,53330)))
perm_all <- function(dat,vname,loc1, loc2){
popu <- dat["vname"]
locci_1 <- sample(dat["loc1"], replace = F)
locci_2 <- sample(dat["loc2"], replace = F)
data_a_1 <- as.data.frame(cbind(popu, locci_1, locci_2))
return(data_a_1)
}
data_3 <- perm_all(dat= "data_a",vname="pop",loc1="PA1",loc2="PA2")
我尝试用
转换data_adata_a <- as.matrix(data_a)
和
popu <- sample(dat[,1], replace = F)
但是他们也没有工作
谢谢:)
答案 0 :(得分:1)
可能存在多个问题。首先,创建数据框后,请注意,默认情况下,data.frame函数族将字符串视为一个因素。可能不是您想要的。
然后@NURAIMIAZIMAH是正确的,您的函数需要一个数据框才能正常工作,所以:
data_3 <- perm_all(dat= data_a,vname="pop",loc1="PA1",loc2="PA2")
是一个好的开始。
此外,您还可以为vname
,loc1
和loc2
之类的向量赋予价值。但是您只在函数中使用这些对象的名称,因为您忘记了删除引号。
perm_all <- function(dat,vname,loc1, loc2){
popu <- dat[vname]
locci_1 <- sample(dat[loc1], replace = F)
locci_2 <- sample(dat[loc2], replace = F)
data_a_1 <- as.data.frame(cbind(popu, locci_1, locci_2))
return(data_a_1)
}
现在,您的函数应该可以工作了,但可能不是您希望的那样。因为您的data_3
表中没有任何排列。如果仔细看,这部分代码dat[loc1]
的返回类型是一个数据帧。当然,您肯定需要一个向量来置换数据,因此必须像这样dat[,loc1]
来对数据帧进行子集化。
下面的代码应能达到您的期望。
data_a <- as.data.frame(cbind(pop=c("a1","b2","c3","d4","d5"),
PA1=c(1,40,430,4330,43330),
PA2=c(2,50,530,5330,53330)))
perm_all <- function(dat,vname,loc1, loc2){
popu <- dat[vname]
locci_1 <- sample(dat[,loc1], replace = F)
locci_2 <- sample(dat[,loc2], replace = F)
data_a_1 <- as.data.frame(cbind(popu, locci_1, locci_2))
return(data_a_1)
}
data_3 <- perm_all(dat= data_a,vname="pop",loc1="PA1",loc2="PA2")
再见。