web-dev-qa-db-ja.com

小数を保持しながらデータフレーム全体を数値に変換する方法は?

データフレーム全体を数値に変換しようとしている混合クラスデータフレーム(数値と係数)があります。以下は、私が取り組んでいるデータのタイプと私が遭遇している問題を示しています。

_> a = as.factor(c(0.01,0.02,0.03,0.04))
> b = c(2,4,5,7)
> df1 = data.frame(a,b)
> class(df1$a)
[1] "factor"
> class(df1$b)
[1] "numeric"
_

データフレーム全体を数値に変換しようとすると、数値が変更されます。例えば:

_> df2 = as.data.frame(sapply(df1, as.numeric))
> class(df2$a)
[1] "numeric"
> df2
  a b
1 1 2
2 2 4
3 3 5
4 4 7
_

このサイトの以前の投稿では、as.numeric(as.character(df1$a))を使用することをお勧めします。これは1つの列に適しています。ただし、このアプローチを何百もの列を含む可能性のあるデータフレームに適用する必要があります。

小数点以下の数値を保持しながら、データフレーム全体を係数から数値に変換するためのオプションは何ですか?

以下は、abが数値である場合に生成したい出力です。

_     a b
1 0.01 2
2 0.02 4
3 0.03 5
4 0.04 7
_

次の関連記事を読みましたが、このケースに直接当てはまるものはありません。

  1. Rの数値を保持しながら因子変数を数値に変換する方法 これは、データフレーム内の単一の列を参照します。
  2. 文字から数値データフレームへの変換 。この投稿では、小数値は考慮されていません。
  3. 10進数を含むファクター列を数値に変換するにはどうすればよいですか? 。これは、データフレーム内の1つの列にのみ適用されます。
20
Borealis

確認が必要になる場合があります。係数を直接数値に安全に変換することはできません。 as.characterを最初に適用する必要があります。それ以外の場合、係数は数値のストレージ値に変換されます。各列をis.factorでチェックし、必要に応じて数値に強制します。

df1[] <- lapply(df1, function(x) {
    if(is.factor(x)) as.numeric(as.character(x)) else x
})
sapply(df1, class)
#         a         b 
# "numeric" "numeric" 
16
Rich Scriven

dplyrを使用(sapplyに少し似ています。)

df2 <- mutate_all(df1, function(x) as.numeric(as.character(x)))

与えるもの:

glimpse(df2)
Observations: 4
Variables: 2
$ a <dbl> 0.01, 0.02, 0.03, 0.04
$ b <dbl> 2, 4, 5, 7

あなたのdf1から:

glimpse(df1)
Observations: 4
Variables: 2
$ a <fctr> 0.01, 0.02, 0.03, 0.04
$ b <dbl> 2, 4, 5, 7
13
R. Prost
df2 <- data.frame(apply(df1, 2, function(x) as.numeric(as.character(x))))
3
n8sty
> df2 <- data.frame(sapply(df1, function(x) as.numeric(as.character(x))))
> df2
     a b
1 0.01 2
2 0.02 4
3 0.03 5
4 0.04 7
> sapply(df2, class)
        a         b 
"numeric" "numeric" 
1
Jilber Urbina