函数为空后的新数据帧

时间:2019-05-27 21:18:52

标签: r function dataframe

我准备一个具有临时数据帧的函数,但是当我将此函数应用于旧数据帧时,该临时数据帧为空。我该如何解决?

我尝试了以下代码:

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_a
data_a <- as.matrix(data_a)

 popu <- sample(dat[,1], replace = F)

但是他们也没有工作

谢谢:)

1 个答案:

答案 0 :(得分:1)

可能存在多个问题。首先,创建数据框后,请注意,默认情况下,data.frame函数族将字符串视为一个因素。可能不是您想要的。

然后@NURAIMIAZIMAH是正确的,您的函数需要一个数据框才能正常工作,所以:

data_3 <- perm_all(dat= data_a,vname="pop",loc1="PA1",loc2="PA2")

是一个好的开始。

此外,您还可以为vnameloc1loc2之类的向量赋予价值。但是您只在函数中使用这些对象的名称,因为您忘记了删除引号。

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")

再见。