programing

데이터 프레임 열을 숫자 형식으로 변환하는 방법은 무엇입니까?

testmans 2023. 7. 9. 10:36
반응형

데이터 프레임 열을 숫자 형식으로 변환하는 방법은 무엇입니까?

데이터 프레임 열을 숫자 유형으로 변환하는 방법은 무엇입니까?

(표시를 받지 못했기 때문에, 어떤 하지 않았기 에, 여러분은 에 두고 합니다.numeric당신이 지원해야 한다고 제안합니다.transform작업을 완료하기 위해 기능합니다.

이제 "변환 이상"을 보여드리겠습니다.

# create dummy data.frame
d <- data.frame(char = letters[1:5], 
                fake_char = as.character(1:5), 
                fac = factor(1:5), 
                char_fac = factor(letters[1:5]), 
                num = 1:5, stringsAsFactors = FALSE)

다음을 살펴 보겠습니다.data.frame

> d
  char fake_char fac char_fac num
1    a         1   1        a   1
2    b         2   2        b   2
3    c         3   3        c   3
4    d         4   4        d   4
5    e         5   5        e   5

도망치자꾸나

> sapply(d, mode)
       char   fake_char         fac    char_fac         num 
"character" "character"   "numeric"   "numeric"   "numeric" 
> sapply(d, class)
       char   fake_char         fac    char_fac         num 
"character" "character"    "factor"    "factor"   "integer" 

이제 여러분은 아마 스스로에게 "이상 현상은 어디에 있나요?"라고 물을 것입니다.음, 저는 R에서 꽤 특이한 것들을 마주쳤고, 이것은 가장 혼란스러운 것은 아니지만, 특히 침대에 눕기 전에 이것을 읽으면 여러분을 혼란스럽게 할 수 있습니다.

두 의 열은 자, 처두열다같습다니과입니다.character일부러 2명을 불렀죠ndfake_char 이의유을발다니견합성사의 유사점을 찾아보세요.character더크가 답장에서 만든 변수입니다.사은입니다.numerical가 변된벡터로 character3열과rdth 4열은factor"purely고그리유마입은막 "지령니다"입니다."입니다.numeric.

당신이 경우는하를 한다면.transform함수, 당신은 변환할 수 있습니다.fake_char안으로numeric그러나 그것은 아닙니다.char변수 자체입니다.

> transform(d, char = as.numeric(char))
  char fake_char fac char_fac num
1   NA         1   1        a   1
2   NA         2   2        b   2
3   NA         3   3        c   3
4   NA         4   4        d   4
5   NA         5   5        e   5
Warning message:
In eval(expr, envir, enclos) : NAs introduced by coercion

하지만 만약 당신이 같은 일을 한다면,fake_char그리고.char_fac운이 좋을 것이고, NA 없이 도망칠 수 있을 것입니다.

> transform(d, fake_char = as.numeric(fake_char), 
               char_fac = as.numeric(char_fac))

  char fake_char fac char_fac num
1    a         1   1        1   1
2    b         2   2        2   2
3    c         3   3        3   3
4    d         4   4        4   4
5    e         5   5        5   5

을 저장하는 data.frame다음을 확인합니다.mode그리고.class다음을 얻을 수 있습니다.

> D <- transform(d, fake_char = as.numeric(fake_char), 
                    char_fac = as.numeric(char_fac))

> sapply(D, mode)
       char   fake_char         fac    char_fac         num 
"character"   "numeric"   "numeric"   "numeric"   "numeric" 
> sapply(D, class)
       char   fake_char         fac    char_fac         num 
"character"   "numeric"    "factor"   "numeric"   "integer"

결론은 다음과 같습니다. 벡터를 하나로 변환할 수 있지만 요소가 "변환 가능"한 경우에만 변환할 수 있습니다. 단 하나만 있으면character벡터의 요소, 그 벡터를 변환하려고 할 때 오류가 발생할 것입니다.numerical 둘, 셋

그리고 내 요점을 증명하기 위해서야:

> err <- c(1, "b", 3, 4, "e")
> mode(err)
[1] "character"
> class(err)
[1] "character"
> char <- as.numeric(err)
Warning message:
NAs introduced by coercion 
> char
[1]  1 NA  3  4 NA

이제 재미로(또는 연습을 위해) 다음 명령의 출력을 추측해 보십시오.

> fac <- as.factor(err)
> fac
???
> num <- as.numeric(fac)
> num
???

패트릭 번스에게 안부 전해 주세요!=)

이 된 의 범위가 은 저게도이된것또가: 변변범위의수이다수있상니습사있으용할면둘에움환할는또▁to▁▁use가▁can다▁you있▁you),▁of니수:▁(저▁if습or▁that▁convert를 사용할 수 있습니다.sapply.

약간 터무니없지만 예를 들어보겠습니다.

data(cars)
cars[, 1:2] <- sapply(cars[, 1:2], as.factor)

3열, 6-15열 및 37열의 데이터 프레임을 숫자로 변환해야 한다고 가정하면 다음과 같습니다.

dat[, c(3,6:15,37)] <- sapply(dat[, c(3,6:15,37)], as.numeric)

한다면x의 열 이름입니다.dat,그리고.x다음을 사용합니다.

as.numeric(as.character(dat$x))

코멘트를 추가했을 것입니다(낮은 평가 가능).

사용자 276042와 팡그라츠를 추가하기 위해서입니다.

dat$x = as.numeric(as.character(dat$x))

기존 열 x의 값을 재정의합니다.

다음 코드를 사용하여 모든 데이터 프레임 열을 숫자로 변환할 수 있습니다(X는 해당 열을 변환하려는 데이터 프레임입니다).

as.data.frame(lapply(X, as.numeric))

전체 행렬을 숫자로 변환하는 데는 두 가지 방법이 있습니다.다음 중 하나:

mode(X) <- "numeric"

또는:

X <- apply(X, 2, as.numeric)

또는 사용할 수 있습니다.data.matrix모든 것을 숫자로 변환하는 기능. 그러나 요인이 올바르게 변환되지 않을 수도 있으므로 모든 것을 변환하는 것이 더 안전합니다.character첫 번째:

X <- sapply(X, as.character)
X <- data.matrix(X)

행렬과 숫자로 동시에 변환하려면 보통 마지막 것을 사용합니다.

질문이 숫자에 국한되어 있지만, R을 시작할 때 이해하기 어려운 변환이 많이 있습니다.저는 도움이 되는 방법들을 다루는 것을 목표로 할 것입니다.이 질문은 이 질문과 유사합니다.

(1) 요인을 숫자로 직접 변환할 수 없고, 먼저 문자 클래스로 변환해야 하며, (2) 날짜는 일반적으로 별도로 처리해야 하는 특수한 경우이며, (3) 데이터 프레임 열을 순환하는 것이 까다로울 수 있기 때문에 R에서 유형 변환은 번거로울 수 있습니다.다행히도, "tidyverse"는 대부분의 문제를 해결했습니다.

이 솔루션은 다음을 사용합니다.mutate_each()데이터 프레임의 모든 열에 함수를 적용합니다.이 경우, 우리는 다음을 적용하고자 합니다.type.convert()가능한 경우 문자열을 숫자로 변환하는 함수입니다.R은 요인을 좋아하기 때문에 문자를 유지해야 하는 문자 열이 요인으로 변경됩니다.이 문제를 해결하려면,mutate_if()함수는 요인이 되고 문자로 변경되는 열을 탐지하는 데 사용됩니다.마지막으로, 저는 초보자들에게도 종종 걸림돌이 되기 때문에 러브레이트가 어떻게 캐릭터 수업의 타임스탬프를 날짜-시간으로 바꿀 수 있는지 보여주고 싶었습니다.


library(tidyverse) 
library(lubridate)

# Recreate data that needs converted to numeric, date-time, etc
data_df
#> # A tibble: 5 × 9
#>             TIMESTAMP SYMBOL    EX  PRICE  SIZE  COND   BID BIDSIZ   OFR
#>                 <chr>  <chr> <chr>  <chr> <chr> <chr> <chr>  <chr> <chr>
#> 1 2012-05-04 09:30:00    BAC     T 7.8900 38538     F  7.89    523  7.90
#> 2 2012-05-04 09:30:01    BAC     Z 7.8850   288     @  7.88  61033  7.90
#> 3 2012-05-04 09:30:03    BAC     X 7.8900  1000     @  7.88   1974  7.89
#> 4 2012-05-04 09:30:07    BAC     T 7.8900 19052     F  7.88   1058  7.89
#> 5 2012-05-04 09:30:08    BAC     Y 7.8900 85053     F  7.88 108101  7.90

# Converting columns to numeric using "tidyverse"
data_df %>%
    mutate_all(type.convert) %>%
    mutate_if(is.factor, as.character) %>%
    mutate(TIMESTAMP = as_datetime(TIMESTAMP, tz = Sys.timezone()))
#> # A tibble: 5 × 9
#>             TIMESTAMP SYMBOL    EX PRICE  SIZE  COND   BID BIDSIZ   OFR
#>                <dttm>  <chr> <chr> <dbl> <int> <chr> <dbl>  <int> <dbl>
#> 1 2012-05-04 09:30:00    BAC     T 7.890 38538     F  7.89    523  7.90
#> 2 2012-05-04 09:30:01    BAC     Z 7.885   288     @  7.88  61033  7.90
#> 3 2012-05-04 09:30:03    BAC     X 7.890  1000     @  7.88   1974  7.89
#> 4 2012-05-04 09:30:07    BAC     T 7.890 19052     F  7.88   1058  7.89
#> 5 2012-05-04 09:30:08    BAC     Y 7.890 85053     F  7.88 108101  7.90

다음과 같은 문제가 발생하는 경우:

as.numeric(as.character(dat$x))

당신의 소수점을 보세요."."(예: "5,3") 대신 "."이면 위의 항목이 작동하지 않습니다.

잠재적인 해결책은 다음과 같습니다.

as.numeric(gsub(",", ".", dat$x))

저는 이것이 몇몇 비영어권 국가들에서 꽤 흔하다고 생각합니다.

팀 말이 맞아요 셰인이 빠졌네요다음은 추가 예입니다.

R> df <- data.frame(a = as.character(10:15))
R> df <- data.frame(df, num = as.numeric(df$a), 
                        numchr = as.numeric(as.character(df$a)))
R> df
   a num numchr
1 10   1     10
2 11   2     11
3 12   3     12
4 13   4     13
5 14   5     14
6 15   6     15
R> summary(df)
  a          num           numchr    
 10:1   Min.   :1.00   Min.   :10.0  
 11:1   1st Qu.:2.25   1st Qu.:11.2  
 12:1   Median :3.50   Median :12.5  
 13:1   Mean   :3.50   Mean   :12.5  
 14:1   3rd Qu.:4.75   3rd Qu.:13.8  
 15:1   Max.   :6.00   Max.   :15.0  
R> 

우리들의data.frame이제 요인 열(숫자)의 요약과 숫자 요약이 표시됩니다.as.numeric()숫자 요인 수준을 얻었기 때문에 잘못된 --- 및 (정확한) 요약as.numeric(as.character()).

을 사용한 type.convert()그리고.rapply():

convert_types <- function(x) {
    stopifnot(is.list(x))
    x[] <- rapply(x, utils::type.convert, classes = "character",
                  how = "replace", as.is = TRUE)
    return(x)
}
d <- data.frame(char = letters[1:5], 
                fake_char = as.character(1:5), 
                fac = factor(1:5), 
                char_fac = factor(letters[1:5]), 
                num = 1:5, stringsAsFactors = FALSE)
sapply(d, class)
#>        char   fake_char         fac    char_fac         num 
#> "character" "character"    "factor"    "factor"   "integer"
sapply(convert_types(d), class)
#>        char   fake_char         fac    char_fac         num 
#> "character"   "integer"    "factor"    "factor"   "integer"

데이터 프레임 열을 숫자로 변환하려면 다음 작업만 수행하면 됩니다.

요인을 숫자로:-

data_frame$column <- as.numeric(as.character(data_frame$column))

다른 사람들은 이 주제를 꽤 잘 다루었지만, 저는 이 빠른 생각/힌트를 추가하고 싶습니다.regexp를 사용하여 문자가 잠재적으로 숫자로만 구성되어 있는지 여부를 미리 확인할 수 있습니다.

for(i in seq_along(names(df)){
     potential_numcol[i] <- all(!grepl("[a-zA-Z]",d[,i]))
}
# and now just convert only the numeric ones
d <- sapply(d[,potential_numcol],as.numeric)

더 세련된 정규 표현과 그 힘을 배우고 경험해야 하는 깔끔한 이유는 다음과 같은 멋진 웹사이트를 참조하십시오.

데이터 프레임에 여러 유형의 열이 있고 일부 문자가 있는 경우 일부 숫자는 숫자 값이 포함된 열만 숫자로 변환하기 위해 다음을 시도합니다.

for (i in 1:length(data[1,])){
  if(length(as.numeric(data[,i][!is.na(data[,i])])[!is.na(as.numeric(data[,i][!is.na(data[,i])]))])==0){}
  else {
    data[,i]<-as.numeric(data[,i])
  }
}

hablar 포함::삭제

열을 데이터 하려면 여러을열사수있다데유이형방쉽변법게환을 사용할 수 .hablar::convert 구문: 단순구:df %>% convert(num(a))열 a를 df에서 숫자로 변환합니다.

상세예

열을변다니합의 모든 을 변환해 .mtcars성격에 맞는

df <- mtcars %>% mutate_all(as.character) %>% as_tibble()

> df
# A tibble: 32 x 11
   mpg   cyl   disp  hp    drat  wt    qsec  vs    am    gear  carb 
   <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
 1 21    6     160   110   3.9   2.62  16.46 0     1     4     4    
 2 21    6     160   110   3.9   2.875 17.02 0     1     4     4    
 3 22.8  4     108   93    3.85  2.32  18.61 1     1     4     1    

와 함께hablar::convert:

library(hablar)

# Convert columns to integer, numeric and factor
df %>% 
  convert(int(cyl, vs),
          num(disp:wt),
          fct(gear))

결과:

# A tibble: 32 x 11
   mpg     cyl  disp    hp  drat    wt qsec     vs am    gear  carb 
   <chr> <int> <dbl> <dbl> <dbl> <dbl> <chr> <int> <chr> <fct> <chr>
 1 21        6  160    110  3.9   2.62 16.46     0 1     4     4    
 2 21        6  160    110  3.9   2.88 17.02     0 1     4     4    
 3 22.8      4  108     93  3.85  2.32 18.61     1 1     4     1    
 4 21.4      6  258    110  3.08  3.22 19.44     1 0     3     1   

char 열이 존재할 수 있음을 고려하여, 이는 Excel 시트의 유형 자동으로 다음과 같이 대답하기의 @Abdou에 기반합니다.

makenumcols<-function(df){
  df<-as.data.frame(df)
  df[] <- lapply(df, as.character)
  cond <- apply(df, 2, function(x) {
    x <- x[!is.na(x)]
    all(suppressWarnings(!is.na(as.numeric(x))))
  })
  numeric_cols <- names(df)[cond]
  df[,numeric_cols] <- sapply(df[,numeric_cols], as.numeric)
  return(df)
}
df<-makenumcols(df)

인자 보존에 신경 쓰지 않고 숫자로 변환할 수 있는 열에 적용하고 싶다면 아래 스크립트를 사용했고, 만약 df가 원래 데이터 프레임이라면 아래 스크립트를 사용하면 됩니다.

df[] <- lapply(df, as.character)
df <- data.frame(lapply(df, function(x) ifelse(!is.na(as.numeric(x)), as.numeric(x),  x)))

셰인 조란의 해결책을 참조했습니다 btw.

에서, "PC(Rv.3.2.3)"apply또는sapply실수를 저지르다 lapply잘 작동합니다.

dt[,2:4] <- lapply(dt[,2:4], function (x) as.factor(as.numeric(x)))

문자를 숫자로 변환하려면 다음을 적용하여 요인으로 변환해야 합니다.

BankFinal1 <- transform(BankLoan,   LoanApproval=as.factor(LoanApproval))
BankFinal1 <- transform(BankFinal1, LoanApp=as.factor(LoanApproval))

하나의 열은 숫자로 변환할 수 없으므로 동일한 데이터로 두 개의 열을 만들어야 합니다.하나의 변환을 수행하면 다음 오류가 발생합니다.

transform(BankData, LoanApp=as.numeric(LoanApproval))
Warning message:
  In eval(substitute(list(...)), `_data`, parent.frame()) :
  NAs introduced by coercion

따라서 동일한 데이터의 두 열을 수행한 후 적용됩니다.

BankFinal1 <- transform(BankFinal1, LoanApp      = as.numeric(LoanApp), 
                                    LoanApproval = as.numeric(LoanApproval))

문자를 숫자로 성공적으로 변환합니다.

df데이터 프레임입니다. x는 의열다니의 입니다.df를 .

as.numeric(factor(df$x))

언급URL : https://stackoverflow.com/questions/2288485/how-to-convert-a-data-frame-column-to-numeric-type

반응형