简体   繁体   中英

Cut function in R for All Columns in Dataframe

In a data.frame (wd) I have several columns (X1000mb, X950mb, X800mb....Xn). When I perform the cut(as.vector) function on one column it works (see below)

wd1<-cut(((as.vector(wd$X850mb)) +  360/(16*2) )%% 360,
           seq(0,360,360/16) ,c('N', 'NNE', 'NE', 'ENE', 
                                'E', 'ESE', 'SE', 'SSE', 'S', 'SSW', 
                                'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW'))

However when I try to apply it to the whole dataframe - all columns - I get an error.

wdx<-cut(((as.vector(wd)) +  360/(16*2) )%% 360,
           seq(0,360,360/16) ,c('N', 'NNE', 'NE', 'ENE', 
                                'E', 'ESE', 'SE', 'SSE', 'S', 'SSW', 
                                'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW'))

The error is Error in cut.default(((as.vector(wd)) + 360/(16 * 2))%%360, seq(0, 360, : 'x' must be numeric

The dput for the dataframe is this

dput(head(wd))
structure(list(X1000mb = c(86L, 130L, 75L, 59L, 56L, 69L), X925mb = c(70L, 
45L, 30L, 66L, 54L, 71L), X850mb = c(355L, 349L, 350L, 65L, 36L, 
56L), X700mb = c(331L, 342L, 329L, 35L, 1L, 44L), X600mb = c(328L, 
328L, 321L, 0L, 247L, 227L), X500mb = c(331L, 324L, 317L, 331L, 
251L, 241L), X400mb = c(340L, 328L, 310L, 296L, 261L, 246L), 
    X300mb = c(336L, 334L, 328L, 295L, 259L, 262L), X250mb = c(334L, 
    333L, 348L, 300L, 259L, 279L), X200mb = c(336L, 330L, 356L, 
    331L, 257L, 282L), X150mb = c(333L, 327L, 346L, 342L, 277L, 
    279L), X100mb = c(317L, 326L, 325L, 318L, 260L, 274L), X70mb = c(323L, 
    326L, 332L, 306L, 277L, 276L), X50mb = c(350L, 4L, 352L, 
    328L, 305L, 311L), X30mb = c(5L, 42L, 32L, 15L, 29L, 12L), 
    X20mb = c(3L, 42L, 48L, 30L, 46L, 45L), X10mb = c(28L, 25L, 
    4L, 14L, 104L, 76L)), .Names = c("X1000mb", "X925mb", "X850mb", 
"X700mb", "X600mb", "X500mb", "X400mb", "X300mb", "X250mb", "X200mb", 
"X150mb", "X100mb", "X70mb", "X50mb", "X30mb", "X20mb", "X10mb"
), row.names = c(NA, 6L), class = "data.frame")

I tried to apply as.numeric to the dataframe, still it doesn't work. tried a subset wd[1:17] it did not work.

What am I doing wrong? Constructive criticism is accepted. keep in mind, I am still learning R. Thank you.

You should try apply :

 apply(wd, 2, function(x) cut(((as.numeric(x)) +  360/(16*2) )%% 360,
+     seq(0,360,360/16) ,c('N', 'NNE', 'NE', 'ENE', 
+                          'E', 'ESE', 'SE', 'SSE', 'S', 'SSW', 
+                          'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW')))
     X1000mb X925mb X850mb X700mb X600mb X500mb X400mb X300mb X250mb X200mb X150mb X100mb X70mb X50mb
[1,] "E"     "ENE"  "N"    "NNW"  "NNW"  "NNW"  "NNW"  "NNW"  "NNW"  "NNW"  "NNW"  "NW"   "NW"  "N"  
[2,] "SE"    "NE"   "N"    "NNW"  "NNW"  "NW"   "NNW"  "NNW"  "NNW"  "NNW"  "NNW"  "NW"   "NW"  "N"  
[3,] "ENE"   "NNE"  "N"    "NNW"  "NW"   "NW"   "NW"   "NNW"  "NNW"  "N"    "NNW"  "NW"   "NNW" "N"  
[4,] "ENE"   "ENE"  "ENE"  "NE"   "N"    "NNW"  "WNW"  "WNW"  "WNW"  "NNW"  "NNW"  "NW"   "NW"  "NNW"
[5,] "NE"    "NE"   "NE"   "N"    "WSW"  "WSW"  "W"    "W"    "W"    "WSW"  "W"    "W"    "W"   "NW" 
[6,] "ENE"   "ENE"  "NE"   "NE"   "SW"   "WSW"  "WSW"  "W"    "W"    "WNW"  "W"    "W"    "W"   "NW" 
     X30mb X20mb X10mb
[1,] "N"   "N"   "NNE"
[2,] "NE"  "NE"  "NNE"
[3,] "NNE" "NE"  "N"  
[4,] "NNE" "NNE" "NNE"
[5,] "NNE" "NE"  "ESE"
[6,] "NNE" "NE"  "ENE"

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