как вставить буквы в значения столбца с помощью dplyr? - PullRequest
1 голос
/ 13 июня 2019

Я хотел бы вставить символы в значения столбца фрейма данных со следующим условным условием:

в значениях> 999, например, вставить AG0 будет "AG01000", если оно меньшечем <1000, вставьте AG00, это будет "AG00999" </p>

как это сделать с помощью dplyr, может кто-нибудь мне помочь?

Я просто хочу добавить AG00 в случае, если значение столбца равно 240 = AG00240или если значение, например, 1040 = AG01040.Я хочу всегда быть с 7 символами, не более.

1 Ответ

1 голос
/ 13 июня 2019

Вот пять вариантов.Вам нужен только один из них, выберите тот, который соответствует вашему ожидаемому результату и предпочтениям.

library(dplyr)

tibble(values = c(1, 10, 100, 900, 1000, 2000)) %>%
  mutate(
    x1 = sprintf("AG%05.0f", values),
    x2 = paste0(ifelse(values > 999, "AG0", "AG00"), values),
    x3 = paste0(case_when(
      values > 999 ~ "AG0",
      TRUE ~ "AG00"), values),
    x4 = paste0(case_when(
      values > 999 ~ "AG0",
      values > 99 ~ "AG00",
      values > 9 ~ "AG000",
      TRUE ~ "AG0000"), values),
    # suggested by @Frank
    x5 = paste0("AG", strrep("0", 5-nchar(values)), values)
  )
# # A tibble: 6 x 6
#   values x1      x2      x3      x4      x5     
#    <dbl> <chr>   <chr>   <chr>   <chr>   <chr>  
# 1      1 AG00001 AG001   AG001   AG00001 AG00001
# 2     10 AG00010 AG0010  AG0010  AG00010 AG00010
# 3    100 AG00100 AG00100 AG00100 AG00100 AG00100
# 4    900 AG00900 AG00900 AG00900 AG00900 AG00900
# 5   1000 AG01000 AG01000 AG01000 AG01000 AG01000
# 6   2000 AG02000 AG02000 AG02000 AG02000 AG02000

И если по какой-то причине их более нескольких сотен, возможно, производительность является проблемой:

set.seed(2)
# Browse[4]> 
bigvalues <- sample(1e4, size=1e3)+1
# Browse[4]> 
head(bigvalues)
# [1] 1850 7025 5734 1682 9436 9432
# Browse[4]> 
microbenchmark::microbenchmark(
  x1 = sprintf("AG%05.0f", bigvalues),
  x2 = paste0(ifelse(bigvalues > 999, "AG0", "AG00"), bigvalues),
  x3 = paste0(case_when(
    bigvalues > 999 ~ "AG0",
    TRUE ~ "AG00"), bigvalues),
  x4 = paste0(case_when(
    bigvalues > 999 ~ "AG0",
    bigvalues > 99 ~ "AG00",
    bigvalues > 9 ~ "AG000",
    TRUE ~ "AG0000"), bigvalues),
  x5 = paste0("AG", strrep("0", 5-nchar(bigvalues)), bigvalues)
)
# Unit: microseconds
#  expr    min      lq     mean  median      uq    max neval
#    x1  548.0  567.95  614.107  603.65  634.55  953.6   100
#    x2 1084.7 1150.90 1239.094 1191.75 1250.60 1854.0   100
#    x3 1018.0 1070.35 1127.585 1104.50 1137.25 1693.2   100
#    x4 1092.6 1144.30 1226.597 1177.20 1224.25 2251.2   100
#    x5 1880.5 1970.15 2058.329 2011.00 2055.60 4035.4   100

(Извините, Франк.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...