R: Получить точное значение нулей (килограмм до 1000 и т. Д.) - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть наборы данных, такие как:

dd <- read.csv(text="
value,zeroes 
1   ,1
12  ,2
123 ,k
1234,K
5   ,5
56  ,m
567 ,M")

Я хочу преобразовать их в их точное число. Значение нуля указывает, сколько нулей должно быть в конце значения. Есть Итак, результаты должны отображаться так:

extracted
10
1200
123000
1234000
500000
56000000
567000000

Существует 13 уровней фактора по значению нулей, как мне подойти к этому в r? Спасибо

Ответы [ 3 ]

6 голосов
/ 24 апреля 2020

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

scale <- 10^c("1"=1, "2"=2, k=3, K=4, "5"=5, m=6, M=7)

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

format(
  transform(dd, expand = value * scale[as.character(zeroes)]),
scientific=20)
#   value zeroes     expand
# 1     1      1         10
# 2    12      2       1200
# K   123      k    1230000
# 5  1234      K  123400000
# k     5      5       5000
# m    56      m   56000000
# M   567      M 5670000000

format() здесь просто чтобы отключить стандартную научную c нотацию

для факторного метода вы должны сделать

dd$zeros <- factor(d$zeros, levels=names(scale))
transform(dd, expand = value * scale[zeroes])
1 голос
/ 24 апреля 2020

Мы можем написать функцию:

return_zeroes <- function(x) {
   if(grepl('\\d', x)) 
      paste0(rep(0, x), collapse = "")
   else switch(tolower(x), 'm'='000000','k'= '000')
}

и использовать sapply для ее вызова.

df$extracted <- as.numeric(paste0(df$value, sapply(df$zeroes, return_zeroes)))

df
#  value zeroes extracted
#1     1      1        10
#2    12      2      1200
#3   123      k    123000
#4  1234      K   1234000
#5     5      5    500000
#6    56      m  56000000
#7   567      M 567000000

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

0 голосов
/ 24 апреля 2020

После MrFlick Ответ , я хотел бы предоставить решение, которое помогло решить мою проблему, и я хотел бы сравнить его между нулями как фактор и символ

Шкала должна быть:

scale <- 10^c("1"=1, "2"=2, "k"=3, "K"=3, "5"=5, "m"=6, "M"=6)

сравнить нули в качестве фактора и символа

dd$zeroes <- as.factor(dd$zeroes)
format(
     transform(dd, expand = value * scale[zeroes]),
     scientific=20)
#
value zeroes    expand
     1      1        10
    12      2      1200
   123      k    123000
  1234      K 123400000
     5      5      5000
    56      m  56000000
   567      M 567000000

###############
dd$zeroes <- as.character(dd$zeroes)
format(
     transform(dd, expand = value * scale[zeroes]),
     scientific=20)
#
value zeroes    expand
     1      1        10
    12      2      1200
   123      k    123000
  1234      K   1234000
     5      5    500000
    56      m  56000000
   567      M 567000000

Мы можем получить разницу в значениях нулей K и 5. Я не уверен, почему все изменилось результат между как фактор и как символ

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