2016-03-05 80 views
1
x1=c(55,60,75,80) 
x2=c(30,20,15,23) 
x3=c(4,3,2,6) 
x=data.frame(x1,x2,x3) 

从这个功能:如何改变循环的最终结果为数据帧

NAins=function(x,alpha=0.3){ 
    x.n=NULL 
    for (i in 1:ncol(x)){ 
    S= sort(x[,i], decreasing=TRUE) 
    N= S[ceiling(alpha*nrow(x))] 
    x.n= ifelse(x[,i]>N, NA, x[,i]) 
print(x.n) } 
} 

如何最终结果保存为adataframe样子原始数据集,但是我用data.frame(x.nmar)。 以及如何从循环中获得结果?

+1

如果你想这样的循环方式,则需要预先定义一个矩阵或数据帧,然后填满它。循环结束后,您将需要“返回”它,因为您在该函数中创建的所有变量都将被删除。 'print'并没有被保存在任何地方。另外,在循环中运行'ceiling(alpha * nrow(x))'没有任何意义,因为它始终保持不变。如果每次只有一个选项,则不需要'ifelse'。 –

+0

@DavidArenburg,在循环之前,我创建了具有相同长度原始数据的空数据框,但它没有任何意义。 – user5934339

+0

因为你还没有预先定义任何东西。你只是每次给它赋值NULL。我会发布一个答案,告诉你应该怎么做 –

回答

1

转换评论回答

如果你想实现这种循环方式,你需要预定义一个矩阵o r数据框,然后填写它(在您的情况下,您可以使用原始的xdata.frame,因为该功能不会更新全局环境中的原始数据集)。循环结束后,您将需要返回它,因为您在该函数中创建的所有变量都将被删除。 print也没有被保存在任何地方。而且,在循环中运行ceiling(alpha*nrow(x))没有意义,因为它始终保持不变。如果您每次只有一个选择,则不需要ifelse。见下面

NAins=function(x, alpha = 0.3){ 
    N <- ceiling(alpha * nrow(x)) ## Run this only once (take out of the loop) 
    for(i in 1:ncol(x)){ 
    S <- sort(x[, i], decreasing = TRUE) 
    x[x[, i] > S[N], i] <- NA # don't use `ifelse`, you only inserting one value 
    } 
    x # return the result after the loop ends 
} 

测试

NAins(x) 
# x1 x2 x3 
# 1 55 NA 4 
# 2 60 20 3 
# 3 75 15 2 
# 4 NA 23 NA 
+0

大卫阿伦伯格,非常感谢你的建议,但只是改变'x.n#将结果后缀'返回到'x'给你的结果。 – user5934339

+0

是的,我已经编辑过了。这是一个错字。谢谢。 –

2

最好使用lapply位置避免for-loop的副作用:

NAins <- function(x,alpha=0.3){ 
    Nr <- nrow(x) 
    lapply(x,function(col){ 
    S <- sort(col, decreasing=TRUE) 
    N <- S[ceiling(alpha*Nr)] 
    ifelse(col>N, NA, col) 
    }) 

然后你就可以将结果强制到data.frame

as.data.frame(NAins(dx))