在循环中使用get()

时间:2014-08-10 16:47:04

标签: r loops

我正在尝试在R中编写一个循环,以便它在R中运行两个向量并查找非因子向量并从向量中随机选择一个数字来替换NA数据。

e.g。

gender<-c("male","female","female","male",NA)    ## variable 1
gender<-as.factor(gender)  ## set gender as a factor
age<-c(11.4,13.7,45.6,24, NA)  ## variable 2

vector<-c("gender","age")
total<-2   ##number of variable is 2

for (i in 1:total)
{
 if (is.factor(get(vector[i]))==TRUE)  {print("This is a factor vector")}

 if (is.factor(get(vector[i]))==FALSE)
 {
  get(vector[i])[is.na(get(vector[i]))]<-
  sample(get(vector[i])[!is.na(get(vector[i]))],sum(is.na(get(vector[i])),replace=F))

 }
}

当我运行它时,它说“找不到功能”得到&lt; - “。我不确定问题是什么......

1 个答案:

答案 0 :(得分:4)

编写一个执行na替换的函数。我已经放了replace=TRUE因为如果你有更多的东西需要替换,那么它会在replace=FALSE中失败。但如果您确定要这样做,请将TRUE更改为FALSE

na.sample = 
function(x){miss=is.na(x);x[miss]=sample(x[!miss],sum(miss),TRUE);x}

注意这是一个很好的简单函数,你可以在循环外测试:

> na.sample(c(1,2,3,4,NA,4,3))
[1] 1 2 3 4 4 4 3
> na.sample(c(1,2,3,4,NA,NA,NA))
[1] 1 2 3 4 4 1 1
> na.sample(c(1,NA,NA,NA,NA))
[1] 1 1 1 1 1
> na.sample(c(NA,NA,NA,NA,NA))
Error in sample.int(length(x), size, replace, prob) : 
  invalid first argument

显然最后一个失败了,因为没有什么可以替换它。

所以你的问题。如果你真的想循环变量名称,这是坏事,请使用assign和get。我将展示如何为一个变量名称执行此操作,您的循环应该起作用:

> age
[1] 11.4 13.7 45.6 24.0   NA
> assign("age", na.sample(get("age")))
> age
[1] 11.4 13.7 45.6 24.0 11.4

但是如果你把它们放在一个数据框中。假设您有五个年龄和性别的记录,那么这些内容应该放在数据框中:

> d = data.frame(age=age, gender=gender)
> d
   age gender
1 11.4   male
2 13.7 female
3 45.6 female
4   NA   <NA>
5 11.4   male

然后遍历列名以进行替换。这是一个:

> d[["age"]] = na.sample(d[["age"]])
> d
   age gender
1 11.4   male
2 13.7 female
3 45.6 female
4 45.6   <NA>
5 11.4   male

只需for(name in c("age","gender")){ d[[name]]=na.sample(d[[name]])}替换所有这些内容。整洁不是吗?