30

次のRコードについて考えてみます。

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

同様に

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

10さて、整数と20文字列に変換したくありません。このような変換を行わずにこの操作を実行するにはどうすればよいですか?もちろん、なぜこの変換が行われるのかも知りたいです。私はcbindヘルプを見てグーグルも試しましたが、解決策を見つけることができませんでした。場合によってはそう思います。Rは文字列を因子に変換しますが、ここでは発生していないようですが、これも発生したくありません。

4

2 に答える 2

47

ベクトルと行列は単一のタイプのみであり、cbindベクトルrbind上では行列が得られます。このような場合、そのタイプはすべての値を保持するため、数値は文字値に昇格されます。

rbind(あなたの例では、プロモーションはc通話内で行われることに注意してください。

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

列が異なるタイプになり得る長方形の構造が必要な場合は、が必要ですdata.frame。次のいずれかがあなたが望むものを手に入れるはずです:

> 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

または(具体的にはのdata.frameバージョンを使用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

または(を使用しますが、data.framesのように結合cbindするように最初のを作成します):data.frame

> 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
于 2012-10-08T18:49:37.930 に答える
15

data.frame代わりに使用するcbindと役立つはずです

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" 

ご覧のとおり、col1の要素はnumeric希望どおりです。

data.frameclass異なる:numericの変数を持つことができますが、そうではfactorありません。要素を行列に入れると、以前のクラスに関係なく、他のすべての要素がこのクラスになります。charactermatrixcharacter

于 2012-10-08T18:45:08.490 に答える