2013-07-06 16 views
11

Niedawno miałem problem, w którym za każdym razem, gdy czytałem plik csv zawierający tabelę z wartościami, R odczytał ją jako format listy zamiast numerycznego. Ponieważ żadna nić nie dostarczyła mi całej odpowiedzi na moją sytuację, kiedy udało mi się ją uruchomić, postanowiłem włączyć do niej skrypt, który zadziałał dla mnie z nadzieją, że komuś się przyda. Oto jest, z pewnym opisem i kilkoma opcjami na wypadek, gdybyś tego potrzebował:Konwertowanie z listy na numeryczne w R

(1) Odczytaj dane z pliku csv. Oto plik nie posiada nagłówka, więc kładę F, jeśli twój posiada nagłówka, a następnie zmienić go T.

data <- read.csv("folder_path/data_file.csv", header=F) 

(1.a) Uwaga: Jeśli pojawi się ostrzeżenie, że mówi „niekompletny ostateczna linia znaleziono przez readTableHeader ", oznacza to, że R nie znalazł symbolu końca pliku. Po prostu umieść dodatkową pustą linię na końcu pliku csv, a wiadomość nie pojawi się ponownie.

(2) Można sprawdzić, czy dane są w formacie listy (jeśli jest to numeryczne, to wszystkie są ustawione i wcale nie wymagają tej procedury!) Za pomocą polecenia mode.

mode(data) 

(3) Zainicjuj macierz (jako NA), w której chcesz dane w formacie liczbowym, używając wymiarów danych.

dataNum <- matrix(data = NA, nrow = dim(data)[1], ncol = dim(data)[2]) 

(4) Opcjonalnie: Jeśli chcesz dodać do nazwy kolumn i/lub wierszy, można użyć jednej Jeśli te opcje.

(4a) Dodaj do nazw kolumn i wierszy, przy założeniu, że każdy ma podobne informacje, innymi słowy chcesz nazwy należy col_1, col_2 ... i row_1, row_2 ...

colnames(dataNum) <- colnames(dataNum, do.NULL = F, prefix = "col_") 
rownames(dataNum) <- rownames(dataNum, do.NULL = F, prefix = "row_") 

(4b) Jeśli chcesz mieć różne nazwy dla każdej kolumny i każdego wiersza, użyj tej opcji i dodaj wszystkie nazwy ręcznie.

colnames(dataNum) <- c("col_name_1", "col_name_2") 
rownames(dataNum) <- c("row_name_1", "row_name_2") 

(5) Przekształcenie danych z listy na postać numeryczną i umieścić ją w dataNum matrycy.

for (i in 1:dim(data)[2]) { 
    dataNum[,i] <- c(as.numeric(data[[i]])) 
} 

(6) Możesz sprawdzić, czy macierz jest w formacie liczbowym za pomocą polecenia mode.

mode(dataNum) 

(7) OPCJONALNIE: Jeśli chcesz transponować macierz, możesz skorzystać z poniższej instrukcji.

dataNum <- t(dataNum) 
+6

Nie zamieszczaj odpowiedzi w pytaniu.Napisz nasz problem, który chcesz rozwiązać jako pytanie i prześlij odpowiedź jako faktyczną odpowiedź ... – Dason

+1

Myślę, że jest to prawdopodobnie bardziej odpowiednie na Twoim blogu lub podobnym. Jak wskazuje @Dason, nie pasuje to do stylu Q & A na tej stronie. Sprawdź [** faq **] (http://stackoverflow.com/faq), jeśli szukasz szczegółowych informacji, jeśli nie wiesz, jak publikować w witrynie. Dobry wysiłek wymaga jednak niewielkiej edycji, aby zmienić to ustawienie jako pytania i odpowiedzi. –

Odpowiedz

19

Oto krótszy/szybszy sposób, aby włączyć data.frame do macierzy liczbowej:

data <- data.matrix(data) 

Istnieje również

data <- as.matrix(data) 

ale jedna ważna różnica polega na tym, czy dane zawiera kolumnę z czynnikiem lub kolumną: as.matrix zamieni wszystko na matrycę znaków, a data.matrix zawsze zwróci wartość numeric lubMacierz.

data <- data.frame(
    logical = as.logical(c(TRUE, FALSE)), 
    integer = as.integer(c(TRUE, FALSE)), 
    numeric = as.numeric(c(TRUE, FALSE)), 
    factor = as.character(c(TRUE, FALSE)) 
) 

data.matrix(data) 
#  logical integer numeric factor 
# [1,]  1  1  1  2 
# [2,]  0  0  0  1 

as.matrix(data) 
#  logical integer numeric factor 
# [1,] " TRUE" "1"  "1"  "TRUE" 
# [2,] "FALSE" "0"  "0"  "FALSE" 
+2

Żadne podejście (oryginalne posty lub odpowiedź poniżej) nie działa dla mnie, więc nadal nie mogę uzyskać rzędów ... – SiKiHe

+0

@SikiHe: niezbyt konstruktywny komentarz, czy możesz rozwinąć? Może stwórz własne pytanie z odtwarzalnym przykładem i link do niego stąd ... – flodel

+0

Mam dokładnie ten sam problem co powyżej, dlatego pomyślałem, że nie było potrzeby tworzenia własnego postu. Importuję plik csv i próbuję uzyskać rowsSums, ale otrzymuję komunikat o błędzie, że dane wejściowe do rowSums muszą mieć wartość numeryczną. Próbowałem obu opisanych tutaj podejść i żadne z nich nie działało. Oznacza to, że albo liczby zostały przekształcone w stopnie, a więc sumy w wierszach były nieprawidłowe, ponieważ nie były to oryginalne liczby, które zostały dodane, albo nie były liczbowe i nie można ich było dodać w pierwszej kolejności. – SiKiHe

Powiązane problemy