我正在尝试在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; - “。我不确定问题是什么......
答案 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]])}
替换所有这些内容。整洁不是吗?