programing

선행 0을 추가하는 방법은 무엇입니까?

sourcetip 2023. 7. 31. 22:08
반응형

선행 0을 추가하는 방법은 무엇입니까?

다음과 같은 일련의 데이터가 있습니다.

anim <- c(25499,25500,25501,25502,25503,25504)
sex  <- c(1,2,2,1,2,1)
wt   <- c(0.8,1.2,1.0,2.0,1.8,1.4)
data <- data.frame(anim,sex,wt)

data
   anim sex  wt anim2
1 25499   1 0.8     2
2 25500   2 1.2     2
3 25501   2 1.0     2
4 25502   1 2.0     2
5 25503   2 1.8     2
6 25504   1 1.4     2

각 동물 ID 앞에 0을 추가하고 싶습니다.

data
   anim sex  wt anim2
1 025499   1 0.8     2
2 025500   2 1.2     2
3 025501   2 1.0     2
4 025502   1 2.0     2
5 025503   2 1.8     2
6 025504   1 1.4     2

그리고 흥미를 위해서, 만약 제가 동물의 ID 앞에 2~3개의 0을 추가해야 한다면 어떨까요?

짧은 버전: use 또는.


더 긴 버전:

숫자 형식 지정에는 선행 0 추가를 포함하여 여러 가지 기능을 사용할 수 있습니다.어떤 형식이 가장 좋은지는 수행할 다른 형식에 따라 달라집니다.

모든 값의 숫자가 동일하기 때문에 질문의 예제는 매우 쉽습니다. 따라서 10 너비 8의 검정력을 만드는 더 어려운 예제도 시도해 보겠습니다.

anim <- 25499:25504
x <- 10 ^ (0:5)

paste (그리고 그것은 변형입니다.paste0는 종종 조작 함수입니다는 종종 처음 접하는 문자열 조작 함수입니다.그것들은 숫자를 조작하기 위해 고안된 것은 아니지만, 그것들은 그것에 사용될 수 있습니다.0을 더 하는 에, 우가항을하상 0추야하경는우단순한해가나리의,▁in,한경우을▁the,paste0이것이 최선의 해결책입니다.

paste0("0", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"

숫자에 숫자가 다양한 경우, 앞에 붙일 0의 수를 수동으로 계산해야 하는데, 병적인 호기심에서만 해야 할 정도로 끔찍합니다.


str_pad 에서stringr▁similarly와 비슷하게 작동합니다.paste패드를 넣으려는 것을 더 명확하게 합니다.

library(stringr)
str_pad(anim, 6, pad = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"

다시 말씀드리지만, 숫자와 함께 사용하도록 설계되지 않았기 때문에 어려운 경우에는 약간의 생각이 필요합니다."폭 8에 0이 있는 패드"라고 말할 수 있어야 하지만, 다음 출력을 보십시오.

str_pad(x, 8, pad = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "0001e+05"

숫자가 항상 과학적 표기법이 아닌 고정 표기법을 사용하여 형식이 지정되도록 과학적 페널티 옵션을 설정해야 합니다.

library(withr)
with_options(
  c(scipen = 999), 
  str_pad(x, 8, pad = "0")
)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"

stri_padstringi와 똑같이 작동합니다.str_padstringr.


formatC 는 C 함수의 인터페이스이며, 이를 사용하려면 해당 기본 함수의 아르카나에 대한 지식이 필요합니다(링크 참조).이 경우, 중요한 점은width 논쟁,format"d"for는 "for", "for"는 ""입니다."0" flag에 0을 추가합니다.

formatC(anim, width = 6, format = "d", flag = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
formatC(x, width = 8, format = "d", flag = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"

이것은 폭 변경을 다루기 쉽고 다른 포맷 변경을 할 수 있을 정도로 기능이 강력하기 때문에 제가 가장 좋아하는 솔루션입니다.


sprintf 는 같은 이름의 C 함수에 대한 인터페이스입니다.formatC하지만 구문이 다릅니다.

sprintf("%06d", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
sprintf("%08d", x)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"

의 주요 sprintf형식화된 숫자를 더 긴 텍스트 비트 안에 포함할 수 있습니다.

sprintf(
  "Animal ID %06d was a %s.", 
  anim, 
  sample(c("lion", "tiger"), length(anim), replace = TRUE)
)
## [1] "Animal ID 025499 was a tiger." "Animal ID 025500 was a tiger."
## [3] "Animal ID 025501 was a lion."  "Animal ID 025502 was a tiger."
## [5] "Animal ID 025503 was a tiger." "Animal ID 025504 was a lion." 

좋은 쪽의 답변도 참조하십시오.


완전성을 위해 때때로 유용하지만 0을 추가하는 방법이 없는 다른 형식 지정 함수를 언급할 가치가 있습니다.

숫자에 대한 방법을 사용하여 모든 종류의 객체를 포맷하기 위한 일반적인 format함수입니다.다음과 같이 작동합니다.formatC하지만 또 다른 인터페이스가 있습니다.

prettyNum 수동 축 눈금 레이블을 만드는 또 다른 형식 지정 기능입니다.특히 광범위한 숫자에 적합합니다.

패키지에는 및 전문가 형식 유형에 대한 등의 여러 기능이 있습니다.

수에 data$anim을 사용합니다.sprintf같이 합니다.다음과 같이 작동합니다.

sprintf("%04d", 1)
# [1] "0001"
sprintf("%04d", 104)
# [1] "0104"
sprintf("%010d", 104)
# [1] "0000000104"

당신의 경우, 당신은 아마도 다음을 원할 것입니다.data$anim <- sprintf("%06d", data$anim)

@goodside의 응답에 대한 확장:

경우에 따라 0으로 문자열을 패딩할 수 있습니다(예: FIPS 코드 또는 기타 숫자와 유사한 요소).OSX/Linux의 경우:

> sprintf("%05s", "104")
[1] "00104"

하지만 왜냐하면sprintf()의 COS를 C라고 부릅니다.sprintf()여기서 설명하는 명령은 Windows 7(윈도우 7)에서 다른 결과를 얻을 수 있습니다.

> sprintf("%05s", "104")
[1] "  104"

Windows 컴퓨터에서 해결 방법은 다음과 같습니다.

> sprintf("%05d", as.numeric("104"))
[1] "00104"

str_padstringr패키지는 대안입니다.

anim = 25499:25504
str_pad(anim, width=6, pad="0")

일반화 가능한 기본 R 함수는 다음과 같습니다.

pad_left <- function(x, len = 1 + max(nchar(x)), char = '0'){

    unlist(lapply(x, function(x) {
        paste0(
            paste(rep(char, len - nchar(x)), collapse = ''),
            x
        )
    }))
}

pad_left(1:100)

좋아해요sprintf그러나 다음과 같은 주의 사항이 있습니다.

그러나 실제 구현은 C99 표준을 따르고 세부 사항(특히 사용자 오류 시 동작)은 플랫폼에 따라 달라질 수 있습니다.

다음은 CUSIP와 같은 문자열에 0으로 이어지는 다른 대안입니다. CUSIP는 때때로 숫자처럼 보일 수 있으며 Excel과 같은 많은 응용 프로그램은 선행 0을 손상시키고 제거하거나 과학적 표기법으로 변환합니다.

@는 @metasequoia가 아닌 선행 .0한 것과 입니다. -- @user1816679 했습니다. -- 그고주을가다제인니습했거문용이의변다것니리습은였제문한일동과급한것언▁this▁--▁the▁around▁the▁quotes▁mentioned이것▁@다▁and니user▁wasuser16▁removing▁the▁same▁by▁problem습16181867했제거은을인문용.0또는 에서 변경.%d%s또한 차이를 만들지 않았습니다.참고로, 저는 우분투 서버에서 실행되는 R스튜디오 서버를 사용하고 있습니다. 작은 에게 효과가 : 작은단 2계솔은저에효있다니었습과이가게션루▁this다▁worked.

gsub(pattern = " ", replacement = "0", x = sprintf(fmt = "%09s", ids[,CUSIP]))

사용%>%의 파이프 magrittr패키지는 다음과 같이 보일 수 있습니다.

sprintf(fmt = "%09s", ids[,CUSIP]) %>% gsub(pattern = " ", replacement = "0", x = .)

저는 단기능 솔루션을 선호하지만, 효과가 있습니다.

data$anim <- sapply(0, paste0,data$anim)

당신이 숫자 문자열이 일치하기를 원하는 다른 상황을 위해 함수를 만들었습니다.

누군가는 이것이 유용하다고 생각할 수 있습니다.

idnamer<-function(x,y){#Alphabetical designation and number of integers required
    id<-c(1:y)
    for (i in 1:length(id)){
         if(nchar(id[i])<2){
            id[i]<-paste("0",id[i],sep="")
         }
    }
    id<-paste(x,id,sep="")
    return(id)
}
idnamer("EF",28)

포맷해서 죄송합니다.

언급URL : https://stackoverflow.com/questions/5812493/how-to-add-leading-zeros

반응형