6

次のような長さ n の数値文字列のベクトルがあります (この場合は n=3)。

[1] "111" "111" "111" "111" "111" "111" "111" "111" "111" "111" "111" "111"
[13] "111" "111" "111" "111" "111" "111" "111" "111" "111" "111" "111" "111"
[25] "111" "111" "111" "111" "111" "111" "111" "1 1" "111" "  1" "111" "112"
[37] "121" "111" "111" "111" "11 " "111" "   " "111" "111" "221" "111" "111"
[49] "   " "111" "111"

次のようなマトリックス(またはデータフレーム)に変換したい:

V1   V2   V3
1    1    1
1    1    1
1    1    1
...
1   NA    1
1    1    1
NA   NA   1

substring() と as.numeric() を使用して二重にネストされたループで実行できることはわかっていますが、これを実現するには、より R に似た方法が必要です。誰でも手がかりを提供できますか?

ティア。

4

2 に答える 2

12

使用できますstrsplit。例(ベクトルが という名前のオブジェクトであると仮定x):

y <- strsplit(x,"")
z <- lapply(y, as.numeric)
a <- do.call(rbind, z)

これは上記のソリューションよりも高速ですが、直感的ではありません。 sapply配列に単純化されますが、次元が必要なものと反対であるため、転置する必要があります。

a <- t(sapply(y, as.numeric))

これまでの回答で提案されているさまざまな方法のタイミングの比較を次に示します。

x <- sample(c("111","1 1","  1","112","121","11 ","   ","221"), 1e5, TRUE)
f1 <- function(x) do.call(rbind, lapply(strsplit(x,""), as.numeric))
f2 <- function(x) t(sapply(strsplit(x,""), as.numeric))
f3 <- function(x) read.fwf(file=textConnection(x), widths=c(1,1,1))
library(rbenchmark)
benchmark(f1(x), f2(x), f3(x), replications=10, order="relative",
  columns=c("test","replications","elapsed","relative"))
#    test replications elapsed  relative
# 2 f2(x)           10   5.072  1.000000
# 1 f1(x)           10   6.343  1.250591
# 3 f3(x)           10 119.892 23.638013
于 2012-10-26T01:02:57.880 に答える
7

を使用した解決策を次に示しread.fwf()ます。

x <- c("111", "   ", "221", "  1")

## "fwf" stands for "*f*ixed *w*idth *f*ormatted"
read.fwf(file = textConnection(x), widths = c(1,1,1))
#   V1 V2 V3
# 1  1  1  1
# 2 NA NA NA
# 3  2  2  1
# 4 NA NA  1
于 2012-10-26T02:30:44.710 に答える