1

次の形式のテキスト文字列 (各文字列内にコンマで区切られた 6 つの値 (0 から 100) を持つ) を含む私data.frameのベクトルでは:x

x[1] "3,2,4,34,2,9"
x[2] "45,,67,,,"
x[3] ",,,,99,"

これは私が問題を抱えている実際のベクトルへのリンクです: x.cvs x.cvs

残念ながら、「0」の値は、2 つのコンマの間、または最初のコンマの前、または最後のコンマの後に「空白なし」として記録されます。

最初に次のように変換できるとよいでしょう。

x[1]  "3,2,4,34,2,9"
x[2]  "45,0,67,0,0,0"
x[3]  "0,0,0,0,99,0"

しかし、最も重要なことは、このベクトルを 6 つの異なるベクトル x1、x2、x3、x4、x5、x6 に分割し、それぞれが文字列から値を取得し、カンマ間の「スペースなし」を「0」に置き換えることです。 、たとえば、結果は次のようになります。

x1[3] 0
x6[2] 0

カンマの間に値があれば strsplit() は機能したと思いますが、値がなく、空のスペースでさえないため、NAを取得せずに続行する正しい方法がわかりません。

次のことを試しましたが、多くのエラーが発生します。

x<- as.character(x)
x <- gsub(",,", ",0,", x)
x <- gsub(", ,", ",0,", x)
splitx = do.call("rbind", (strsplit(x, ",")))
splitx = data.frame(apply(splitx, 2, as.numeric))
names(splitx) = paste("x", 1:6, sep = "")

エラーが出ます...

In rbind(c("51", "59", "59", "60", "51", "51"), c("51", "59", "59",  :
  number of columns of result is not a multiple of vector length (arg 10994)
 In apply(splitx, 2, as.numeric) : NAs introduced by coercion
4

1 に答える 1

2

出力として実際に期待するものに応じて、考慮すべき 2 つの代替案を次に示します。

最初のオプションは一連のベクトルを出力しますが、これは少し不必要であり、ワークスペースに多くのオブジェクトがすぐに散らばってしまう可能性があることがわかりました。

私が好む2番目のオプションは、data.frameベクトル「x」のアイテムの1つを表す各行で便利なを作成します。

サンプルデータ

x <- vector()
x[1] <- "3,2,4,34,2,9"
x[2] <- "45,,67,,,"
x[3] <- ",,,,99,"

オプション1

Names <- paste0("A", seq_along(x))
for (i in seq_along(x)) {
  assign(Names[i], {Z <- scan(text=x[i], sep=","); Z[is.na(Z)] <- 0; Z})
}
A1
# [1]  3  2  4 34  2  9
A2
# [1] 45  0 67  0  0  0
A3
# [1]  0  0  0  0 99  0

オプション 2

Z <- read.csv(text = x, header = FALSE)
Z[is.na(Z)] <- 0
Z
#   V1 V2 V3 V4 V5 V6
# 1  3  2  4 34  2  9
# 2 45  0 67  0  0  0
# 3  0  0  0  0 99  0

a から値を抽出するのdata.frameは、目的の行と列を指定するのと同じくらい簡単です。

Z[1, 3]
# [1] 4
Z[2, 4]
# [1] 0
Z[3, c(1, 3, 5)]
#   V1 V3 V5
# 3  0  0 99
于 2013-11-10T09:33:03.490 に答える