2015-01-31 2 views
0

У меня есть подмножество данных в большом наборе данных, который не соответствует исходным типам данных, назначенным при чтении данных в R. Как я могу повторно преобразовать типы данных для подмножества данных, так же, как R будет делать, если бы было прочитано только это подмножество?переконвертировать типы данных в R

Пример: представьте, что существует один стек данных, состоящий из переменных 1-4 (от v1 до v4) и другого набора данных, начиная с имен столбцов от v5 до v8.

V1 V2 V3 V4 
1 32 a 11 a 
2 12 b 32 b 
3 3 c 42 c 
4 v5 v6 v7 v8 
5 a 43 a 35 
6 b 33 b 64 
7 c 55 c 32 

Если я создаю новый ДФ с v5-v8, как я могу автоматически «повторно конвертировать» все данные в соответствующие типы? (Так же, как R бы сделать, если бы я перечитал данные из CSV)

+0

Как вы в конечном итоге с этим в первую очередь? Лучше всего найти проблему, вызвавшую эту проблему, и исправить ее, чтобы вам не пришлось это делать снова. –

ответ

6

Вы можете попробовать type.convert

df1 <- df[1:3,] 
str(df1) 
# 'data.frame': 3 obs. of 4 variables: 
# $ V1: chr "32" "12" "3" 
# $ V2: chr "a" "b" "c" 
# $ V3: chr "11" "32" "42" 
# $ V4: chr "a" "b" "c" 

df1[] <- lapply(df1, type.convert) 
str(df1) 
#'data.frame': 3 obs. of 4 variables: 
#$ V1: int 32 12 3 
#$ V2: Factor w/ 3 levels "a","b","c": 1 2 3 
#$ V3: int 11 32 42 
#$ V4: Factor w/ 3 levels "a","b","c": 1 2 3 

Для подмножества в dataset, вы могли бы использовать grep (как @Richard Скривен упоминается в комментарии)

indx <- grep('^v', df[,1]) 
df2 <- df[(indx+1):nrow(df),] 
df2[] <- lapply(df2, type.convert) 

Предположим, ваш набор данных есть много примеров, когда это происходит, split набор данных на основе индекса группировки (indx1), созданный grepl после удаления т он заголовок строки (indx) и сделать type.convert в «списке».

indx1 <- cumsum(grepl('^v', df[,1]))+1 
lst <- lapply(split(df[-indx,],indx1[-indx]), function(x) { 
       x[] <- lapply(x, type.convert) 
     x}) 

Затем, если вам нужно cbind столбцы (при условии, что nrow является одинаковым для всех элементов списка)

dat <- do.call(cbind, lst) 
+0

Я действительно попробовал type.convert раньше (т. Е. Перед тем, как перейти к stackoverflow), используя sapply и преобразовал все мои данные символов на числовые, поэтому я предположил, что это был неправильный вариант. Любые идеи почему? – AlexR

+2

@AlexR 'sapply' преобразует вывод в' matrix', который может содержать только один 'class'. Поэтому, если есть какой-либо символьный столбец/элемент, он преобразует всю матрицу в класс 'character'. 'lapply' является более безопасным в этом отношении, поскольку он сохраняет вывод в среде списка. – akrun

+0

А, я должен был это осознать. благодаря – AlexR

Смежные вопросы