Преобразовать несколько классов столбцов - PullRequest
0 голосов
/ 10 ноября 2018

Я думаю, что это простой вопрос, но я не нашел подходящего решения. Для начала набор упрощенных данных:

df <- as.data.frame(matrix(1:20, 5, 4))
str(df)

# 'data.frame': 5 obs. of  4 variables:
#  $ V1: int  1 2 3 4 5
#  $ V2: int  6 7 8 9 10
#  $ V3: int  11 12 13 14 15
#  $ V4: int  16 17 18 19 20

Мы видим, что все классы являются целыми числами. Чего я хочу добиться, так это конвертировать 4 класса в целое, числовое, символьное, и коэффициент соответственно. Конечно, я могу использовать

df$V1 <- as.XXX(df$V1)

для каждого столбца, но я думаю, что это неэффективно.

Ожидаемый результат

# 'data.frame': 5 obs. of  4 variables:
#  $ V1: int  1 2 3 4 5
#  $ V2: num  6 7 8 9 10
#  $ V3: chr  "11" "12" "13" "14" ...
#  $ V4: Factor w/ 5 levels "16","17","18",..: 1 2 3 4 5

Вопрос 2

Я ссылаюсь на ответ @ joran в R Назначить (или скопировать) классы столбцов из фрейма данных в другой и запустить следующий код:

myclass <- c("integer", "numeric", "character", "factor")
df.2 <- df
df.2[] <- mapply(FUN = as, df.2, myclass, SIMPLIFY = F)

Когда я звоню df.2, появляется ошибка:

Ошибка в as.character.factor (x): неправильный коэффициент

Тем не менее, можно дозвониться до str(df.2), и, видимо, только V1 и V3 достигают моего запроса.

str(df.2)

# 'data.frame': 5 obs. of  4 variables:
#  $ V1: int  1 2 3 4 5
#  $ V2: int  6 7 8 9 10
#  $ V3: chr  "11" "12" "13" "14" ...
#  $ V4:Formal class 'factor' [package "methods"] with 3 slots
#   .. ..@ .Data   : int  16 17 18 19 20
#   .. ..@ levels  : chr 
#   .. ..@ .S3Class: chr "factor"

Почему функция as не может работать с классами numeric и factor?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Если вы не исключаете метод цикла for, попробуйте следующее:

df <- as.data.frame(matrix(1:20, 5, 4))
type <- c("integer", "numeric", "character", "factor")
for(i in 1:ncol(df)){
  call <- paste("as", type[i], sep = ".")
  df[[i]] <- do.call(call, list(df[[i]]))
}

str(df)

# 'data.frame': 5 obs. of  4 variables:
#  $ V1: int  1 2 3 4 5
#  $ V2: num  6 7 8 9 10
#  $ V3: chr  "11" "12" "13" "14" ...
#  $ V4: Factor w/ 5 levels "16","17","18",..: 1 2 3 4 5
0 голосов
/ 10 ноября 2018

Мы можем использовать mapply и предоставлять функции в виде списка для преобразования столбцов.

df <- as.data.frame(matrix(1:20, 5, 4))

df[] <- mapply(function(x, FUN) FUN(x),
               df, 
               list(as.integer, as.numeric, as.character, as.factor), 
               SIMPLIFY = FALSE)
str(df)
# 'data.frame': 5 obs. of  4 variables:
# $ V1: int  1 2 3 4 5
# $ V2: num  6 7 8 9 10
# $ V3: chr  "11" "12" "13" "14" ...
# $ V4: Factor w/ 5 levels "16","17","18",..: 1 2 3 4 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...