2012-10-08 23 views
23

Aşağıdaki R kodunu göz önünde bulundurun. cbind kullanarak iki vektörten bir veri çerçevesi oluşturma

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

Benzer

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

Şimdi, tamsayılar 10 ve 20 dizeleri dönüştürülebilir istemiyoruz. Bu işlemi böyle bir dönüştürme olmadan nasıl yapabilirim? kursu da bu dönüşümün neden gerçekleştiğini bilmek isterim. cbind yardımına numaralı telefondan baktım ve ayrıca Googling'i denedim ancak çözümünü bulma şansım olmadı. Bazı durumlarda da inanıyorum. R dizeleri faktörlerine dönüştürür ve ben de bunun olmasını istemiyorum, ancak burada olmanın görünmemesine neden olur. istediğiniz gibi col1 numeric vardır sizi elemanları görebileceğiniz gibi

+0

sorun cbind' 'ile değil,' C' ile. Daha iyi anlamak için ihtiyaç duyduğunuz işlev budur. –

cevap

28

Vektörler ve matrisler yalnızca tek tipte olabilir ve cbind ve rbind vektörlerinde matrisler verilecektir. Bu durumlarda, sayısal değerler karakter değerlerine yükseltilecektir, çünkü bu tür tüm değerleri tutacaktır.

(sizin rbind örnekte, promosyon c çağrı içinde meydana geldiği belirtilmelidir. Sütunları farklı olabilen bir dikdörtgen yapı istiyorsanız

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

, bir data.frame istediğiniz herhangi aşağıdaki istediğini almalısınız:

> 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 

veya

(özellikle cbind ait data.frame sürümünü kullanarak)
> 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 

veya (cbind kullanarak, ama data.frames yapmak gibi birleştirir, böylece ilk bir data.frame yapma):

> 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

Detaylı cevap için teşekkürler. Burada Faktörlerin özelliklerine ihtiyacım olduğunu düşünmüyorum ve hatırlamam, sorunlara neden olabileceğidir. Bunun yerine dize değerleri olan bir veri çerçevesi oluşturmanın bir yolu var mı? –

+0

'data.frame' çağrılarına' stringsAsFactors = FALSE 'ekleyin.Eğer aramalar gizliyse (son örnekte olduğu gibi), bunları açık bir şekilde yapmak zorundasınız: 'data.frame (c (" [] "," [] "), stringsAsFactors = FALSE)'. –

+0

Bunu denetleyen global bir dizi 'dizeleriAsFactors 'var. Onu sevk edilen varsayılan değer olarak bırakıyorum ve yeniden üretilebilirlik için gerekli bir temelde değiştirdim. –

9

yerine cbind ait data.frame

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" 

faydalı olmalıdır kullanma. numeric, factor ve character ama matrix bir matris içine bir character eleman koymak kez tüm diğer olursa olsun önce onlar clase bu sınıfa olacak değildir:

data.frame

farklı class değişkenlerini olabilir.

+0

Teşekkürler. "Col2" ve "col3" sınıfını dize yapabilir miyim? –

+0

Maalesef kafam karışmıştı. Sınıfın yerine 'karakter' yerine 'String' yerine hangi sınıfların kullanıldığını görüyorum [bu] (http://stat.ethz.ch/R-manual/R-patched/library/methods/html /Classes.html) 'faktörü' karakter olarak 'as.character (factor) 'yaparak zorlayabilirsiniz. –

İlgili konular