Как преобразовать строку в числовые значения в R, используя общедоступные данные - PullRequest
0 голосов
/ 22 января 2019

Я новичок в области наук о здоровье. Я пытаюсь очистить свой набор данных, прежде чем использовать его для анализа.

У меня есть опыт начинающих в R, и мне нужна помощь в преобразовании строки в числовое значение, чтобы я мог провести анализ переменной.

в общедоступных данных есть символьная переменная, в которой запрашивается восприятие людей системой здравоохранения по шкале Лайкерта, но способ, которым она закодирована в наборе данных: «1 - ужасно; 2; 3; 4 ;. .. 10 - Отлично "

Все, что я хочу сделать, это:
1) Преобразуйте «1 - ужасный» в просто «1» и то же самое с 10.
2) Я также хотел бы опустить все «Не знаю / отказался» - убрать это из моего знаменателя.

Я выполнил начальный поиск и нашел некоторые функции (strsplit), но у меня возникают трудности с его применением в моей ситуации

Ответы [ 5 ]

0 голосов
/ 23 января 2019

Вы можете использовать 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),]
0 голосов
/ 22 января 2019

Если вы хотите сделать «вещи с фреймами данных», стоит узнать 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")

Вы можете использовать mutate с gsub и as.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, в зависимости от последующего анализа.

0 голосов
/ 22 января 2019
df$yourcol<-as.integer(gsub("\\D","",df$yourcol))
0 голосов
/ 22 января 2019

Незначительная модификация ответа @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]*"))  
0 голосов
/ 22 января 2019

Добро пожаловать на ТАК! Вам следует зайти на эту страницу справки с несколькими советами о том, как сделать ответы на ваши вопросы проще. В частности, вы должны предоставить правильный пример . Это может быть пугающе, но если вам удалось найти str_split, то вы явно способны копать глубже. Я бы посоветовал вам обратиться за одним из очень доступных бесплатных вступлений к 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

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

EDIT: Что касается игнорирования значения NA, вам нужно сказать нам, что вы пытаетесь сделать. Многие функции в R имеют атрибут, игнорирующий значения NA (na.rm = TRUE), но он может подходить или не подходить.

...