R транспонирования числовых data.frame приводит к символьным переменным - PullRequest
0 голосов
/ 21 октября 2018

У меня есть data.frame, который содержит символьную переменную и несколько числовых переменных, что-то вроде этого:

sampleDF <- data.frame(a = c(1,2,3,"String"), b = c(1,2,3,4), c= c(5,6,7,8), stringsAsFactors = FALSE)

, которое выглядит так:

       a b c
1      1 1 5
2      2 2 6
3      3 3 7
4 String 4 8

I 'Я хотел бы переместить этот data.frame и сделать так, чтобы он выглядел следующим образом:

  V1 V2 V3     V4
1  1  2  3 String
2  1  2  3      4
3  5  6  7      8

Я пытался

c<-t(sampleDF)

, а также

d<-transpose(sampleDF)

, но обаэти методы приводят к тому, что V1, V2 и V3 теперь имеют тип characer, хотя имеют только числовые значения.

Я знаю, что это уже задавалось несколько раз.Однако я не нашел подходящего ответа на вопрос, почему в этом случае V1, V2 и V3 также преобразуются в символ.

Можно ли каким-либо образом обеспечить, чтобы эти столбцы оставались числовыми?

Большое спасибо за любые извинения за двойную природу этого вопроса.

РЕДАКТИРОВАТЬ:

as.data.frame(t(sampleDF)

Не решает проблему:

'data.frame':   3 obs. of  4 variables:
 $ V1: Factor w/ 2 levels "1","5": 1 1 2
  ..- attr(*, "names")= chr  "a" "b" "c"
 $ V2: Factor w/ 2 levels "2","6": 1 1 2
  ..- attr(*, "names")= chr  "a" "b" "c"
 $ V3: Factor w/ 2 levels "3","7": 1 1 2
  ..- attr(*, "names")= chr  "a" "b" "c"
 $ V4: Factor w/ 3 levels "4","8","String": 3 1 2
  ..- attr(*, "names")= chr  "a" "b" "c"

1 Ответ

0 голосов
/ 21 октября 2018

После транспонирования преобразуйте столбцы в numeric с помощью type.convert

out <- as.data.frame(t(sampleDF), stringsAsFactors = FALSE)
out[] <- lapply(out, type.convert, as.is = TRUE)
row.names(out) <- NULL
out
#   V1 V2 V3     V4
#1  1  2  3 String
#2  1  2  3      4
#3  5  6  7      8

str(out)
#'data.frame':  3 obs. of  4 variables: 
#  $ V1: int  1 1 5
#  $ V2: int  2 2 6
#  $ V3: int  3 3 7    
#  $ V4: chr  "String" "4" "8"

или rbind первого столбца, преобразованного в соответствующие «типы» с транспонированными другими столбцами

rbind(lapply(sampleDF[,1], type.convert, as.is = TRUE), 
               as.data.frame(t(sampleDF[2:3])))

ПРИМЕЧАНИЕ. Первый метод был бы более эффективным


Или другой подход заключался бы в paste значениях в каждом столбце и последующем его чтении

read.table(text=paste(sapply(sampleDF, paste, collapse=" "), 
     collapse="\n"), header = FALSE, stringsAsFactors = FALSE)
#  V1 V2 V3     V4
#1  1  2  3 String
#2  1  2  3      4
#3  5  6  7      8

Или мы можем преобразовать «data.frame» в «data.matrix», который изменяет элементы character на NA, с помощью is.na найти индекс элементов, которые являются NA длязамена на исходные строковые значения

m1 <- data.matrix(sampleDF)
out <- as.data.frame(t(m1))
out[is.na(out)] <- sampleDF[is.na(m1)]

или другой вариант type_convert из readr

library(dplyr)
library(readr)
sampleDF %>% 
     t %>%
     as_data_frame %>%
     type_convert
# A tibble: 3 x 4
#     V1    V2    V3 V4    
#   <int> <int> <int> <chr> 
#1     1     2     3 String
#2     1     2     3 4     
#3     5     6     7 8     
...