【问题标题】:How to convert string to numeric values in R using publicly available data如何使用公开数据将字符串转换为 R 中的数值
【发布时间】:2019-01-22 00:02:29
【问题描述】:

我是健康科学专业的数据科学初学者。我正在尝试清理我的数据集,然后再将其用于分析。

我有 R 的初学者经验,在将字符串转换为数值时需要一些帮助,以便我可以对变量进行分析。

在公开可用的数据中,有一个字符变量,它以李克特量表询问人们对医疗保健系统的看法,但其在数据集中的编码方式是“1 - 糟糕;2;3;4;。 .. 10 - 优秀”

我只想:
1) 将“1 - 可怕”转换为“1”,与 10 相同。
2)我还想省略所有“不知道/拒绝”——从我的分母中删除它。

我进行了一些初步搜索,发现了一些函数 (strsplit),但我在将其应用到我的情况时遇到了困难

【问题讨论】:

  • 嗨,欢迎来到 SO!请查看how to ask 以及如何提供良好的reproducible example,因为这使得提供答案变得更加容易。在这种情况下,如果您尝试使用 strsplit 但没有成功,那么错误是什么?
  • 如果您提供几行数据集,显示响应可以采用的所有值,将会有所帮助。或者将我们指向在线数据,因为它是公开可用的。
  • 感谢您的欢迎和回复。我还没有编写任何代码,因为我不太确定如何使用 strsplit 的功能。我正在使用 R Markdown,通常在编写代码之前,我会阅读如何理解一段代码然后应用它。但是,我无法理解它,以及如何使用该功能。我已经加载了我的数据集,为每个变量创建了摘要和表格。然而,清洁是我卡住的地方。任何建议或帮助表示赞赏。
  • neilfws,谢谢你的好点子,它位于:open.canada.ca/data/dataset/… 及其变量:Q2 和 Q3,我试图将其从字符转换为数字。

标签: r string numeric


【解决方案1】:

欢迎来到 SO!您应该查看此Help page,并提供一些关于如何让您的问题更容易回答的提示。值得注意的是,您应该提供proper example。这可能令人生畏,但如果您设法找到str_split,那么您显然有能力进行更深入的挖掘。我建议您选择very accessible free intros to R 之一。

# This is the bare minimum you should provide us with

likert <- c("1 - terrible", "2 - bad", 
            "3 - average", "4 - good", "5 - excellent", "Don't know")


# This seems to be what you're attempting
library(stringr)

likert_numeric <- as.numeric(str_extract(string = likert, pattern = "\\d")) 
# str_extract will take out the first occurrence of the pattern in the string, still as a string
# \\d tells R to look for one digit

likert_numeric
#> [1] 1 2 3 4 5 NA

# But perhaps you just want to code the variable as a factor, 
# which will tell R to treat it appropriately in statistical settings
likert_factor <- as.factor(likert)

likert_factor
#> [1] 1 - terrible  2 - bad       3 - average   4 - good      5 - excellent
#> Levels: 1 - terrible 2 - bad 3 - average 4 - good 5 - excellent

您可能想玩弄数字版本只是为了获得一些快速而肮脏的结果;但从长远来看,你想知道什么是因素以及如何使用它们。

编辑: 至于忽略 NA 值,您需要告诉我们您要做什么。 R 中的许多函数都具有忽略 NA 值的属性 (na.rm = TRUE),但它可能适合也可能不适合。

【讨论】:

    【解决方案2】:
    df$yourcol<-as.integer(gsub("\\D","",df$yourcol))
    

    【讨论】:

      【解决方案3】:

      对@FonsMA 答案的小修改,因为它会修剪两位数(即 10)。以下应该会有所帮助。

      txt <- data.frame(character = c("1 - terrible","2 - awful", "3 - bad", "4 - not 
      good", "5 - umm", "6 - OK", "7 - good", "8 - great", "9 - fantastic", "10-excellent"),
      code = 0)
      
      library(stringr)
      txt$code <- as.numeric(str_extract(string = txt$character, pattern = "[0-9]*"))
      

      对于您的实际用例,我只需在您的数据框中创建额外的变量,然后使用str_extract

      你可以这样做:

      YOURDATAFRAME$newCol <- 0
      YOURDATAFRAME$newCol <- as.numeric(str_extract(string = YOURDATAFRAME$STRCOL, pattern = "[0-9]*"))  
      

      【讨论】:

        【解决方案4】:

        如果你想做“有数据框的事情”,值得了解dplyr

        您可以直接从网上获取数据集:

        library(readr)
        library(dplyr)
        
        cdn_attitudes <- read_csv("http://www.hc-sc.gc.ca/data-donnees/por-rop/cdn-attitudes-healthcare_attitudes-canadiens-system-soins.csv")
        

        一些例子。您可以使用filter 删除行,例如,Q2 为“不知道/拒绝”:

        cdn_attitudes %>%
          filter(Q2 != "Don't know/Refuse")
        

        您可以将mutategsubas.numeric 一起使用以删除任何“非数字”并转换为数字:

        cdn_attitudes %>%
          mutate(Q2 = gsub("\\D+", "", Q2)) %>%
          mutate(Q2 = as.numeric(Q2))
        

        现在变得更复杂了。我们可以filter_at 过滤多个列,mutate_at 可以同时改变多个列中的值。

        所以要过滤 Q2 和 Q3 上的行,然后转换为数字:

        cdn_attitudes %>% 
          filter_at(vars(Q2, Q3), 
                    all_vars(. != "Don't know/Refuse")) %>% 
          mutate_at(vars(Q2, Q3), 
                    funs(gsub("\\D+", "", .))) %>% 
          mutate_at(vars(Q2, Q3), 
                    funs(as.numeric(.)))
        

        您应该考虑删除所有带有“不知道/拒绝”的行是否真的是您想要做的 - 可能更好地将它们例如转换为 NA,具体取决于下游分析。

        【讨论】:

          【解决方案5】:

          您可以为此使用readr::parse_number

          library(readr)
          df1 <- data.frame(rate =c("1 - terrible","Don't know", "2","3","4",
                                    "10 - Excellent", "Refused"))
          df1$clean_rate <- parse_number(df1$rate,c("Don't know","Refused"))
          df1
          #             rate clean_rate
          # 1   1 - terrible          1
          # 2     Don't know         NA
          # 3              2          2
          # 4              3          3
          # 5              4          4
          # 6 10 - Excellent         10
          # 7        Refused         NA
          

          如果您愿意,可以删除 NA,一种方法是:

          df1 <- df1[!is.na(df1$clean_rate),]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-08-12
            • 2019-07-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-25
            相关资源
            最近更新 更多