如何使用公开数据将字符串转换为R中的数值

时间:2019-01-22 00:02:29

标签: r string numeric

我是健康科学领域的数据科学初学者。我正在尝试先清理我的数据集,然后再进行分析。

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

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

我要做的是:
1)将“ 1-糟糕”转换为仅“ 1”,并与10相同。
2)我也想省略所有的“不知道/拒绝”-从我的分母中删除。

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

5 个答案:

答案 0 :(得分:1)

欢迎您!您应该查看此Help page,并提供一些有关如何使问题更易于回答的提示。值得注意的是,您应该提供一个proper example。这可能令人望而生畏,但如果您设法找到this.http.post('https://api.channeladvisor.com/oauth2/token', {body:` grant_type = refresh_token & refresh_token = ${something} `}, {headers:{ 'Authorization':this.token, 'Content-Type':'application/x-www-form-urlencoded' }}) ,那么您显然有能力进一步深入。我建议您选择very accessible free intros to R之一。

str_split

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

编辑: 至于忽略NA值,您需要告诉我们您要做什么。 R中的许多函数都具有忽略NA值(# 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 )的属性,但它可能适合也可能不合适。

答案 1 :(得分:0)

df$yourcol<-as.integer(gsub("\\D","",df$yourcol))

答案 2 :(得分:0)

对@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]*"))  

答案 3 :(得分:0)

如果您想做“带有数据帧的事情”,那么值得了解dplyr

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

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

您应该考虑是否确实要删除带有“不知道/拒绝”的所有行-可能最好将其 eg 转换为NA,具体取决于下游分析。

答案 4 :(得分:0)

您可以为此使用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),]