简体   繁体   中英

Applying a function across 3 columns in a data frame only returns one column

I am trying to normalize all columns within a data frame using the function written below. When I try to apply it to all columns using the for loop below, the output returns only one column when I would expect three. The output is normalized correctly suggesting the function works and the for loop is the issue.

seq_along(df) returns the same output

### example df

df <- cbind(as.data.frame(c(2:12), c(3:13), c(4:14)))

### normalization function
rescale <- function(x) {    
  (x - min(x, na.rm = TRUE)) / (max(x, na.rm = TRUE) - min(x, na.rm = TRUE))    
}


### for loop that returns one column although properly normalized

for (i in 1:ncol(df)){      
  i <- df[[i]]  
  output <- as.data.frame(rescale(i))
}

The syntax of as.data.frame is as.data.frame(x, row.names = NULL, optional = FALSE, ...) . That means that in the call as.data.frame(c(2:12), c(3:13), c(4:14)) c(3:13) is being assigned to the argument row.names and c(4:14) to the ellipse . This means that your data.frame only has one column: 2:12 .

The correct version should be: df <- as.data.frame(cbind(c(2:12), c(3:13), c(4:14))) . Of course you should use the function scale instead of writing it yourself

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM