Как динамически преобразовать все типы данных столбцов в числовые и символьные?

Я конвертирую тип данных моих столбцов вручную:

data[,'particles'] <- as.numeric(as.character(data[,'particles']))

Это не идеально, так как данные могут развиваться, и я не буду уверен, какие виды прибывают, например, они могут быть -"nox", "no2", "co", "so2", "pm10" и многое другое в будущем.

Есть ли способ их автоматически конвертировать?

Мой текущий набор данных:

structure(list(particles = structure(c(1L, 3L, 5L, 5L, 5L, 5L, 
    5L, 5L, 5L, 5L, 5L, 6L, 2L, 2L, 2L, 3L, 3L, 3L, 1L, 1L, 4L, 4L, 
    4L, 3L, 3L, 3L, 3L, 5L, 6L, 5L, 3L), .Label = c("1", "11", "1.1", 
    "2", "2.1", "3.1"), class = "factor"), humidity = structure(c(4L, 
    7L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 6L, 1L, 1L, 1L, 
    5L, NA, NA, NA, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("0.1", 
    "1", "1.1", "1.3", "21", "2.1", "3"), class = "factor"), timestamp = c(1468833354929, 
    1468833365186, 1468833378458, 1468833538213, 1468833538416, 1468833538613, 
    1468833538810, 1468833538986, 1468833539172, 1468833539358, 1468833539539, 
    1468833554592, 1468833559059, 1468833562357, 1468833566225, 1468833573486, 
    1468840019118, 1468840024950, 1469029568849, 1469029584243, 1469029590530, 
    1469029622391, 1469029623598, 1469245154003, 1469245156533, 1469245156815, 
    1469245157123, 1469245162358, 1469245165911, 1469245170178, 1469245173788
    ), date = structure(c(1468833354.929, 1468833365.186, 1468833378.458, 
    1468833538.213, 1468833538.416, 1468833538.613, 1468833538.81, 
    1468833538.986, 1468833539.172, 1468833539.358, 1468833539.539, 
    1468833554.592, 1468833559.059, 1468833562.357, 1468833566.225, 
    1468833573.486, 1468840019.118, 1468840024.95, 1469029568.849, 
    1469029584.243, 1469029590.53, 1469029622.391, 1469029623.598, 
    1469245154.003, 1469245156.533, 1469245156.815, 1469245157.123, 
    1469245162.358, 1469245165.911, 1469245170.178, 1469245173.788
    ), class = c("POSIXct", "POSIXt"), tzone = "Asia/Singapore")), .Names = c("particles", 
    "humidity", "timestamp", "date"), row.names = c(NA, -31L), class = "data.frame")

Она имеетparticles, humidity, timestamp, date.

Ответы на вопрос(5)

применять

Ты можешь сделать

newD<-apply(data[,"names"], 2,function(x) as.numeric(as.character(x)))

где в «имена» вы помещаете все переменные, которые вы хотите. Затем примените с 2 в качестве второго аргумента, примените функцию (x) ко всем столбцам (если вы поставите 1 по строкам) первого аргумента. И вы можете сохранить его как новый набор данных или переписать старый с

data[,"names"]<-apply....
 laukok23 июл. 2016 г., 11:38
@ Нарендра и Ян для объяснения.
 Rich Scriven25 авг. 2016 г., 20:45
apply это не лучший вариант. Он предназначен для использования на матрицах и превратит этот фрейм данных в матрицу.
 laukok23 июл. 2016 г., 11:27
спасибо но что2 за?
 narendra-choudhary23 июл. 2016 г., 11:33
@ teelou ЭтоMARGIN аргумент.2 означает, что функция будет применена к столбцам фрейма данных. Если вы хотите применить функцию к строкам, вы напишите 1.
 Jan Sila23 июл. 2016 г., 11:33
Это означает, что функция (x) должна применяться к каждому столбцу. например, colMeans (данные) эквивалентны для применения (данные, 2, среднее значение), а для rowMeans (данные) вы можете использовать эквивалентно применение (данные, 1, среднее значение). Вы видите разницу?

Еще один вариант использованияmutate_if() отdplyr который позволяет вам работать со столбцами, для которых возвращается предикатTRUE

library(dplyr)
df %>% 
  mutate_if(is.factor, funs(as.numeric(as.character(.))))

Заметка: Этот метод будет работать для вашегодополнительный вопрос также

 Minnow24 авг. 2016 г., 21:21
Это решение настолько элегантно, что должно носить цилиндр и ездить на Rolls Royce.

Мы можем использоватьdata.table

library(data.table) 
setDT(df)[, lapply(.SD, function(x) if(is.factor(x)) as.numeric(as.character(x)) else x)]
Решение Вопроса

какие столбцы нужно преобразовать заранее, вы можете извлечь эту информацию из вашего фрейма данных следующим образом:

vec <- sapply(dat, is.factor)

который дает:

> vec
particles  humidity timestamp      date 
     TRUE      TRUE     FALSE     FALSE 

Затем вы можете использовать этот вектор для преобразования в подмножестве сlapply:

# notation option one:
dat[, vec] <- lapply(dat[, vec], function(x) as.numeric(as.character(x)))
# notation option two:
dat[vec] <- lapply(dat[vec], function(x) as.numeric(as.character(x)))

Если вы хотите определить как факторные, так и символьные столбцы, вы можете использовать:

sapply(dat, function(x) is.factor(x)|is.character(x))

использованиеlapply:

cols <- c("particles", "nox", ...)

data[,cols] <- lapply(data[,cols], function(x) as.numeric(as.character(x)))

Ваш ответ на вопрос