2

以下のデータ セットの例のように、数字のゼロの代わりにハイフンが使用されているデータ セットがありmy.dataます。ハイフンをゼロに置き換えることはできますが、影響を受ける列を数値に変換する際に問題が発生します。私の実際のデータ セットは非常に大きく、多くの列があり、どの列にハイフンが含まれるかわかりません。また、データ セットが大きすぎて複雑すぎて、R に読み込む前に、データ セット自体の中で検索と置換を快適に使用することができません。

実際のデータ セットの最初の 3 列は文字列で、残りの列は数値列である必要があると思います (ハイフンがない場合)。ハイフンを含むすべての列を数値に変換する効率的で一般的な方法はありますか?

以下に1つの方法を示しますが、かなり面倒です。

私はここで多くの同様の投稿を見つけましたが、それらは一般的に、欠落している観測を別のものに置き換える方法、または特定の既知の因子列を文字または数値形式に変換する方法を尋ねているようです. 見落としていた可能性はありますが、変換が必要な特定の列が不明なこの特定の問題に対処する投稿は見つかりませんでした。アドバイスありがとうございます。

my.data <- read.table(text = "
landuse units grade Clay    Lincoln    Basin     McCartney     Maple
apple   acres AAA     1         -          3             4         6
apple   acres AA   1000       900         NA            NA       700
pear    acres AA   10.0        20         NA          30.0         -
peach   acres AAA   500        NA        350           300       200
", sep = "", header = TRUE, stringsAsFactors = FALSE, na.string=c('NA'))

my.data
str(my.data)

my.data[my.data == '-'] = '0'

as.numeric(my.data[,4:dim(my.data)[2]])

# Error: (list) object cannot be coerced to type 'double'

# The two lines below work but are too specific
# my.data$Lincoln <- as.numeric(my.data$Lincoln)
# my.data$Maple   <- as.numeric(my.data$Maple)

str(my.data)

# Here I unlist the columns I want to be numeric,
# convert them to a numeric matrix and then create a data frame.
# But this seems cumbersome.

un.my.data <- unlist(my.data[,4: dim(my.data)[2]])
un.my.data <- as.numeric(un.my.data)

my.data.2 <- matrix(un.my.data, nrow=dim(my.data)[1], byrow=F)
colnames(my.data.2) <- names(my.data)[4:dim(my.data)[2]]

new.data <- data.frame(my.data[,1:3], my.data.2)
new.data
str(new.data)
4

3 に答える 3

3

正規表現を使用して に置き換え-0から、数値に変換します。これらすべてを次のようにラップしますlapply

my.data[-(1:3)] <- lapply(
  my.data[-(1:3)], 
  function(x)as.numeric(gsub("-", 0, x))
)

my.data
  landuse units grade Clay Lincoln Basin McCartney Maple
1   apple acres   AAA    1       0     3         4     6
2   apple acres    AA 1000     900    NA        NA   700
3    pear acres    AA   10      20    NA        30     0
4   peach acres   AAA  500      NA   350       300   200
于 2012-11-20T10:12:17.520 に答える
3

sapplyハイフンの変換と数値への変換の両方を、 andを使用して 1 つのコマンドで実行できますgsub

cbind(my.data[ , 1:3],
      sapply(my.data[ , -(1:3)], function(x) as.numeric(gsub("^-$", "0", x))))


  landuse units grade Clay Lincoln Basin McCartney Maple
1   apple acres   AAA    1       0     3         4     6
2   apple acres    AA 1000     900    NA        NA   700
3    pear acres    AA   10      20    NA        30     0
4   peach acres   AAA  500      NA   350       300   200
于 2012-11-20T10:10:26.523 に答える
0

それ以外の

as.numeric(my.data[,4:dim(my.data)[2]])

これを試して:

my.data[,-(1:3)] <-
  matrix(as.numeric(as.matrix(my.data[,-(1:3))),nrow=nrow(my.data))
str(my.data)

「最初の 3 つの列を除くすべて」を で取ったことに注意して[,-(1:3)]ください[,4: dim(my.data)[2]]

于 2012-11-20T10:07:13.880 に答える