Как мне преобразовать строку в число в R, если строка содержит букву? - PullRequest
0 голосов
/ 03 июля 2018

В настоящее время я помогаю другу в его исследованиях и собираю информацию о различных стихийных бедствиях, которые произошли в период с 2004 по 2016 годы. Данные можно найти по этой ссылке: https://www1.ncdc.noaa.gov/pub/data/swdi/stormevents/csvfiles/ когда вы импортируете его в R, он дает полезную информацию, однако, мой друг, а теперь меня интересуют только штат, год, месяц, событие, тип, округ, прямые и косвенные смерти и травмы, а также материальный ущерб. Итак, сначала я извлекаю нужные мне столбцы и позже в коде объединю их вместе, однако в настоящее время данные находятся в строковом режиме, для столбца Повреждение свойства мне нужно представить его как числовой, поскольку он в денежной форме. Так, например, у меня есть запись данных в этом столбце, которая выглядит как «8.6k», и мне нужно это как 8600, и все записи «NA» должны быть заменены на 0.

Пока у меня есть это, но оно возвращает мне строку "NA". Кто-нибудь может придумать лучший способ сделать это?

State<- W2004$STATE
Year<-W2004$YEAR
Month<-W2004$MONTH_NAME
Event<-W2004$EVENT_TYPE
Type<-W2004$CZ_TYPE
County<-W2004$CZ_NAME
Direct_Death<-W2004$DEATHS_DIRECT
Indirect_Death<-W2004$DEATHS_INDIRECT
Direct_Injury<-W2004$INJURIES_DIRECT
Indirect_Injury<-W2004$INJURIES_INDIRECT
W2004$DAMAGE_PROPERTY<-as.numeric(W2004$DAMAGE_PROPERTY)
Damage_Property<-W2004$DAMAGE_PROPERTY
l <- cbind( all the columns up there) 
print(l)

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

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

Во-первых, настройки:

options(scipen = 999) # to prevent R from printing scientific numbers
library(stringr) # to extract letters

Это пример вектора:

numbers_with_letters <- c("1.00M", "8.6k", 50)

Используйте lapply(), чтобы перебрать вектор, извлечь букву, заменить ее на число, удалить букву, преобразовать в числовое значение и умножить:

lapply(numbers_with_letters, function(x) {
  letter <- str_extract(x, "[A-Za-z]")

  letter_to_num <- switch(letter, 
                          k = 1000,
                          M  = 1000000,
                          1) # 1 is the default option if no letter found

  numbers_with_letters <- as.numeric(gsub("[A-Za-z]", "", x))

  #remove all NAs and replace with 0
  numbers_with_letters[is.na(numbers_with_letters)] <- 0 

  return(numbers_with_letters * letter_to_num)

})

Возвращает:

[[1]]
[1] 1000000

[[2]]
[1] 8600

[[3]]
[1] 50

[[4]]
[1] 0
0 голосов
/ 03 июля 2018

Может быть, я упрощаю здесь, но. , ,

library(tidyverse)

data <- tibble(property_damage = c("8.6k", "NA"))

data %>%
 mutate(
  as_number = if_else(
   property_damage != "NA",
   str_extract(property_damage, "\\d+\\.*\\d*"),
   "0"
  ),
  as_number = as.numeric(as_number)
 )
0 голосов
/ 03 июля 2018

Мы можем попытаться использовать здесь случай, когда выражение, чтобы отобразить каждый тип единицы на истинное число. Следуя двум примерам, которые вы нам показали:

library(dplyr)

x <- c("1.00M", "8.6k")
result <- case_when(
    grepl("\\d+k$", x) ~ as.numeric(sub("\\D+$", "", x)) * 1000,
    grepl("\\d+M$", x) ~ as.numeric(sub("\\D+$", "", x)) * 1000000,
    TRUE ~ as.numeric(sub("\\D+$", "", x))
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...