user5934339
user5934339

Reputation: 41

How to change final result of loop as a data frame

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

From this function :

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

How to save the final result as adataframe look like the original dataset ?however I used data.frame(x.nmar) . and How to get the result out of the loop ?.

Upvotes: 1

Views: 51

Answers (2)

David Arenburg
David Arenburg

Reputation: 92300

Converting the comment to answer

If you want to achieve this the loop way, you will need to predefine a matrix or a data frame and then fill it up (In your case you can just use your original x data.frame because the function will not update the original data set in the global environment). After the loop ends, you will need to return it because all the variables you've created within the function will be removed. print isn't being saved anywhere neither. Also, running ceiling(alpha*nrow(x)) in a loop doesn't make sense as it always stays the same. Neither the ifelse is needed if you only have a single alternative each time. See below

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
}

Test

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

Upvotes: 1

agstudy
agstudy

Reputation: 121608

Better to use lapply here to avoid side effect of the 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)
  })

Then you can coerce the result to a data.frame:

 as.data.frame(NAins(dx))

Upvotes: 2

Related Questions