2017-05-30 24 views
3

私はこのデータフレームを持っていると私は、NUMにCHR値を変更したい:R - 複数の列からchr値をnumに変換しますか?

> dput(Df) 
structure(list(`@MeasurementDateGMT` = c("2016-09-01 00:00:00", 
"2016-09-01 01:00:00", "2016-09-01 02:00:00", "2016-09-01 03:00:00", 
"2016-09-01 04:00:00", "2016-09-01 05:00:00", "2016-09-01 06:00:00", 
"2016-09-01 07:00:00", "2016-09-01 08:00:00", "2016-09-01 09:00:00", 
"2016-09-01 10:00:00", "2016-09-01 11:00:00", "2016-09-01 12:00:00", 
"2016-09-01 13:00:00", "2016-09-01 14:00:00", "2016-09-01 15:00:00", 
"2016-09-01 16:00:00", "2016-09-01 17:00:00", "2016-09-01 18:00:00", 
"2016-09-01 19:00:00", "2016-09-01 20:00:00", "2016-09-01 21:00:00", 
"2016-09-01 22:00:00", "2016-09-01 23:00:00"), `@Value` = c("10.9", 
"9.8", "9.9", "14.1", "13.6", "16.5", "15", "18.5", "18", "17", 
"16.6", "12", "12.1", "18.1", "15.9", "15.9", "16.9", "21.6", 
"23.5", "40.7", "16.6", "12.7", "12.4", "12.2")), .Names = c("@MeasurementDateGMT", 
"@Value"), class = "data.frame", row.names = c(NA, 24L)) 

コード変換するには:

columns <- sapply(Df, is.factor) 
Df[, columns] <- lapply(Df[, columns, drop = FALSE], function(x) as.numeric(as.character(x))) 

結果:

> str(Df) 
'data.frame': 24 obs. of 2 variables: 
$ @MeasurementDateGMT: chr "2016-09-01 00:00:00" "2016-09-01 01:00:00" "2016-09-01 02:00:00" "2016-09-01 03:00:00" ... 
$ @Value    : chr "10.9" "9.8" "9.9" "14.1" ... 

を彼らはまだchrあります。私は何を逃したのですか?何か案は?

+1

'columns'は' c(FALSE、FALSE) 'を返します。あなたは何もしない機能を 'lapply'しています。 'Df [、columns]' – thelatemail

+0

@ikopを参照してください。正確には、OPのコードは正常に動作します。 'as.numeric(as.character(...')は、実際には因子変数を変換するための良い習慣です。それは最初に 'Df'に何の要因もないことが残念です。:/ – thelatemail

+0

@thelatemail何結果は 'columns'が返すべきでしょうか? – laukok

答えて

2

type.convertを使用できます。カラムはOPのポスト内のすべてのcharacter、我々は変換する必要はありませんされたよう

Df[] <- lapply(Df, function(x) type.convert(x, as.is = TRUE)) 
str(Df) 
#'data.frame': 24 obs. of 2 variables: 
#$ @MeasurementDateGMT: chr "2016-09-01 00:00:00" "2016-09-01 01:00:00" "2016-09-01 02:00:00" "2016-09-01 03:00:00" ... 
#$ @Value    : num 10.9 9.8 9.9 14.1 13.6 16.5 15 18.5 18 17 

...

我々は「日時」列を変換する必要がある場合は、

Df[[2]] <- as.POSIXct(Df[[2]]) 

characcterにそれtype.convertを適用する前に、それ以外の場合は使用type.convert(as.character(x), ..


さて、私たちはdplyrが必要な場合に行うには、この

library(dplyr) 
res <- Df %>% 
     mutate_all(funs(type.convert(as.character(.), as.is = TRUE))) 
str(res) 
#'data.frame': 24 obs. of 2 variables: 
#$ @MeasurementDateGMT: chr "2016-09-01 00:00:00" "2016-09-01 01:00:00" "2016-09-01 02:00:00" "2016-09-01 03:00:00" ... 
#$ @Value    : num 10.9 9.8 9.9 14.1 13.6 16.5 15 18.5 18 17 ... 

それとも別のオプションは、

library(data.table) 
setDT(Df)[, lapply(.SD, function(x) type.convert(x, as.is = TRUE))] 
+0

ありがとうございます。日付は 'chr'です。どのように' POSIXct、format'に変更できますか? – laukok

+1

@teelouあなたのタイトルは 'chr'を 'numeric'カラムに変換するものです。 – akrun

1
data.table

あなたはすべての列に(この場合はas.numericで)関数を適用dplyr::mutate_ifを使用することができますされています述語関数(この場合はis.character)を満たす。

library(dplyr) 

df %>% 
    janitor::clean_names() %>% # removes the "@" from names since that messes up mutate_if 
    tibble::as_tibble() %>% # just for the nice printing 
    mutate_if(is.character, as.numeric) 

#> Warning in eval(substitute(expr), envir, enclos): NAs introduced by 
#> coercion 

#> # A tibble: 24 x 2 
#> x_measurementdategmt x_value 
#>     <dbl> <dbl> 
#> 1     NA 10.9 
#> 2     NA  9.8 
#> 3     NA  9.9 
#> 4     NA 14.1 
#> 5     NA 13.6 
#> 6     NA 16.5 
#> 7     NA 15.0 
#> 8     NA 18.5 
#> 9     NA 18.0 
#> 10     NA 17.0 
#> # ... with 14 more rows 

しかし、それはdatetime型であるため、上記の最初のカラムではうまく機能しません。数字以外の文字が含まれているため、NAによってas.numericに設定されます。代わりにdatetime変数に変更する必要があります。

df %>% 
    janitor::clean_names() %>% 
    tibble::as_tibble() %>% 
    mutate(x_measurementdategmt = lubridate::as_datetime(x_measurementdategmt)) %>% 
    mutate_if(is.character, as.numeric) 
#> # A tibble: 24 x 2 
#> x_measurementdategmt x_value 
#>     <dttm> <dbl> 
#> 1 2016-09-01 04:00:00 10.9 
#> 2 2016-09-01 05:00:00  9.8 
#> 3 2016-09-01 06:00:00  9.9 
#> 4 2016-09-01 07:00:00 14.1 
#> 5 2016-09-01 08:00:00 13.6 
#> 6 2016-09-01 09:00:00 16.5 
#> 7 2016-09-01 10:00:00 15.0 
#> 8 2016-09-01 11:00:00 18.5 
#> 9 2016-09-01 12:00:00 18.0 
#> 10 2016-09-01 13:00:00 17.0 
#> # ... with 14 more rows 
関連する問題