R ~ dplyr :: case_when% в% 35:39, выбирает только целые числа, такие как 35.0, но не значения с дробями, например 35.1 - PullRequest
1 голос
/ 04 июня 2019

Фон

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

Проблема # 1 состоит в том, что% в% -операторе только подмножество значений, которые являются целыми числами (например, возраст 35.0 или 38.0), но не рациональные числа с 1/10 фракциями, отличными от .0, такие как 48,6 или 56,7.

Проблема # 2 также относится к% в% и долях. В этом случае% в% с диапазоном, например, 1.29: 1.55 выбирает только значения, которые в точности равны 1.29 или 1.55, но не имеют промежуточных значений.

Должен ли я каким-то образом указывать R, что я делю значения на их 1/10 дроби? Диапазон отлично работает, когда значения являются целыми числами, например,% в% 200: 205 будет подмножество значений 200, 201, 202, 203, 204, 205. И все же по какой-то причине, если я хотел выбрать диапазон% в% 20.0 : 20,5, это дает мне 20,0 и 20,5, а не 20,0, 20,1, 20,2, 20,3, 20,4 и 20,5.

File.Score <- File %>%
  filter(sex == "FEMALE") %>%
  mutate(Score.Age = case_when(age_sc %in% 35:39 ~ 2,
                           age_sc %in% 40:44 ~ 4,
                           age_sc %in% 45:49 ~ 5,
                           TRUE ~ 0))

File.Score <- File %>%
  filter(sex == "FEMALE") %>%
  mutate(Score.HDL = case_when(HDL > 1.55 ~ -2,
                           HDL %in% 1.29:1.55 ~ -1,
                           HDL %in% 1.16:1.29 ~ 0,
                           HDL %in% 0.9:1.16 ~ 1,
                           HDL < 0.9 ~ 2))

ISSUE 1
#Range of ages that should be scored
head(File$Age, 50)
 [1] 42.3 26.3 29.2 59.8 36.1 43.0 56.7 48.6 47.0 42.2 38.0

#Ages that are scored 
head(File.Score$Score.Age, 11)
 [1] NA NA NA NA NA 4 NA NA 5 NA 2

#In other words, only the integers are chosen with a 1/10 fraction of 0.

ISSUE 2
#Range of HDL-values that should be scored
head(File$HDL, 11)
 [1] 1.67 1.73 2.05 0.95 1.38 1.60 1.51 1.29 1.34 1.27 1.18

#HDL-values scored
head(File.Score$Score.HDL, 11)

 [1] -2 -2 -2 NA NA NA NA -1 NA NA NA

#Only the values that are specified by > -operator and those at the edges 
of the range are subset. Values between 1.29 and 1.55 are not subset.

Та же проблема возникла, когда я попытался использовать ifelse вместо case_when .

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

  • Я использую Rstudio версии 1.1.447
  • Я использую dplyr версии 0.8.0.1
  • Все значения числовые как .doubles, а не как.integers.

1 Ответ

0 голосов
/ 04 июня 2019

Спасибо, Грегор!

between оказалось решением проблемы.

File.Score <- File %>%
  filter(sex == "FEMALE") %>%
  mutate(Score.Age = case_when(between(age_sc, 35, 39) ~ 2,
                           between(age_sc, 40, 44) ~ 4,
                           between(age_sc, 45, 49) ~ 5,
                           TRUE ~ 0))
...