如何将循环的最终结果更改为数据框

时间:2016-03-05 21:12:50

标签: r

 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)。 以及如何从循环中获得结果?。

2 个答案:

答案 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))

答案 1 :(得分:1)

将评论转换为答案

如果你想以循环方式实现这一点,你需要预定义矩阵或数据框然后填充它(在你的情况下,你可以使用你的原始x data.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