如果字符串包含字母,如何将字符串转换为R中的数字?

时间:2018-07-03 10:52:03

标签: r

我目前正在帮助一位朋友进行研究,并收集有关2004-2016年发生的各种自然灾害的信息。可以使用以下链接找到数据: documentation 当您将其导入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 :(得分:3)

我们可以尝试在此处使用表达式时将每种类型的单位映射到真实编号。结合您实际向我们展示的两个示例:

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))
)

答案 1 :(得分:0)

您可以提取字母并使用易于维护的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

答案 2 :(得分:0)

也许我在这里简化了,但是。 。 。

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)
 )