2012-10-08 17 views
23

Należy wziąć pod uwagę następujący kod R.Tworzenie ramki danych z dwóch wektorów przy użyciu cbind

> x = cbind(c(10, 20), c("[]", "[]"), c("[[1,2]]","[[1,3]]")) 
> x 
    [,1] [,2] [,3]  
[1,] "10" "[]" "[[1,2]]" 
[2,] "20" "[]" "[[1,3]]" 

Podobnie

> x = rbind(c(10, "[]", "[[1,2]]"), c(20, "[]", "[[1,3]]")) 
> x 
    [,1] [,2] [,3]  
[1,] "10" "[]" "[[1,2]]" 
[2,] "20" "[]" "[[1,3]]" 

Teraz nie chcę liczby całkowite 10 i 20 być konwertowane do łańcuchów. Jak mogę wykonać tę operację bez takiej konwersji? Chciałbym, aby kurs również chciał wiedzieć, dlaczego ta konwersja ma miejsce. Spojrzałem na pomoc i próbowałem Googling, ale nie miałem szczęścia znalezienie rozwiązania . Uważam też, że w niektórych przypadkach. R konwertuje ciągi znaków na czynniki , i nie chcę, aby tak się działo, choć nie wydaje się, aby to się tutaj działo .

+0

Problem nie jest z 'cbind', ale z' C'. Tę funkcję musisz lepiej zrozumieć. –

Odpowiedz

28

Wektory i macierze mogą być tylko jednego typu, a cbind i rbind na wektorach nadają macierze. W takich przypadkach wartości numeryczne będą promowane do wartości znaków, ponieważ ten typ będzie zawierał wszystkie wartości.

(Zauważ, że w swoim przykładzie rbind, promowanie dzieje wewnątrz c rozmowy.

> c(10, "[]", "[[1,2]]") 
[1] "10"  "[]"  "[[1,2]]" 

Jeśli chcesz prostokątną konstrukcję, gdzie kolumny mogą być różnych typów, chcesz data.frame Każde z poniższych powinien dostać to, co chcesz:

> x = data.frame(v1=c(10, 20), v2=c("[]", "[]"), v3=c("[[1,2]]","[[1,3]]")) 
> x 
    v1 v2  v3 
1 10 [] [[1,2]] 
2 20 [] [[1,3]] 
> str(x) 
'data.frame': 2 obs. of 3 variables: 
$ v1: num 10 20 
$ v2: Factor w/ 1 level "[]": 1 1 
$ v3: Factor w/ 2 levels "[[1,2]]","[[1,3]]": 1 2 

lub (przy użyciu specjalnie wersję data.frame z cbind)

> x = cbind.data.frame(c(10, 20), c("[]", "[]"), c("[[1,2]]","[[1,3]]")) 
> x 
    c(10, 20) c("[]", "[]") c("[[1,2]]", "[[1,3]]") 
1  10   []     [[1,2]] 
2  20   []     [[1,3]] 
> str(x) 
'data.frame': 2 obs. of 3 variables: 
$ c(10, 20)    : num 10 20 
$ c("[]", "[]")   : Factor w/ 1 level "[]": 1 1 
$ c("[[1,2]]", "[[1,3]]"): Factor w/ 2 levels "[[1,2]]","[[1,3]]": 1 2 

lub (używając cbind, ale co do pierwszego data.frame tak, że łączy jak data.frames zrobić):

> x = cbind(data.frame(c(10, 20)), c("[]", "[]"), c("[[1,2]]","[[1,3]]")) 
> x 
    c.10..20. c("[]", "[]") c("[[1,2]]", "[[1,3]]") 
1  10   []     [[1,2]] 
2  20   []     [[1,3]] 
> str(x) 
'data.frame': 2 obs. of 3 variables: 
$ c.10..20.    : num 10 20 
$ c("[]", "[]")   : Factor w/ 1 level "[]": 1 1 
$ c("[[1,2]]", "[[1,3]]"): Factor w/ 2 levels "[[1,2]]","[[1,3]]": 1 2 
+0

Dzięki za szczegółową odpowiedź. Myślę, że nie potrzebuję tutaj właściwości Czynników, a moim wspomnieniem jest to, że mogą powodować problemy. Czy istnieje sposób na utworzenie ramki danych z wartościami łańcuchów? –

+0

Dodaj 'stringsAsFactors = FALSE' do wywołań' data.frame'.Jeśli wywołania są niejawne (jak w ostatnim przykładzie), musisz je jawnie: 'data.frame (c (" [] "," [] "), stringiAsFactors = FALSE)'. –

+0

Istnieje również opcja globalna 'stringsAsFactors', która kontroluje to. Zostawiam to jako domyślne i zmienię je w razie potrzeby w celu zapewnienia powtarzalności. –

9

Korzystanie data.frame zamiast cbind powinny być pomocne

x <- data.frame(col1=c(10, 20), col2=c("[]", "[]"), col3=c("[[1,2]]","[[1,3]]")) 
x 
    col1 col2 col3 
1 10 [] [[1,2]] 
2 20 [] [[1,3]] 

sapply(x, class) # looking into x to see the class of each element 
    col1  col2  col3 
"numeric" "factor" "factor" 

Jak widać elementy z kol1 są numeric jak chcesz.

data.frame może mieć zmienne o różnym class: numeric, factor i character ale matrix nie raz można umieścić element character do matrycy wszystkie inne staną w tej klasie bez względu na to co clase były wcześniej.

+0

Dzięki. Czy mogę utworzyć klasę "col2" i "col3" w łańcuchu? –

+0

Przepraszam, że byłem zdezorientowany. Miałem na myśli klasy 'character' zamiast' string', aby zobaczyć, co klasy R zobacz [this] (http://stat.ethz.ch/R-manual/R-patched/library/methods/html /Classes.html), możesz zmusić 'czynnik' do bycia' znakiem', wykonując 'as.character (factor)'. –

Powiązane problemy