Как сформировать 1 столбец из существующего столбца, определяющего 3 уровня, используя R? - PullRequest
0 голосов
/ 21 января 2019

Мой код

date$dmilk=ifelse(date$del<=100,paste("1",date$dmilk),
    (date$del>=100,paste("2",date$dmilk),
    (date$del>=200,paste("3"date$dmilk),
    (date$del>=300,paste("4",date$dmilk))

Я хотел бы сформировать новый столбец dmilk на основе условных ограничений. Кто-нибудь может мне помочь?


del dmilk
21
320
362
288
81
66
267
235
229
425
383
361
197
260
106
238
74
102
148
197
329
428

Ответы [ 3 ]

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

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

Вы не дадите нам то, что было в dmilk, поэтому я просто предположил, что это был текст "наполнитель "

dat <- data.frame(del = c(21, 320, 362, 288, 81, 66, 267, 235, 229, 425, 383, 361, 197, 
260, 106, 238, 74, 102, 148, 197, 329, 428), dmilk = "filler")

val <- findInterval(dat$del, c(100, 200, 300))+1 #gives 0-3 so add 1 to get 1-4
dat$dmilk <- paste(val, dat$dmilk)

, который дает

> dat
   del    dmilk
1   21 1 filler
2  320 4 filler
3  362 4 filler
4  288 3 filler
5   81 1 filler
6   66 1 filler
7  267 3 filler
8  235 3 filler
9  229 3 filler
10 425 4 filler
11 383 4 filler
12 361 4 filler
13 197 2 filler
14 260 3 filler
15 106 2 filler
16 238 3 filler
17  74 1 filler
18 102 2 filler
19 148 2 filler
20 197 2 filler
21 329 4 filler
22 428 4 filler
0 голосов
/ 21 января 2019

Если вы хотите сохранить оператор ifelse, вам нужно их вложить.Кроме того, условия должны быть взаимоисключающими, чтобы нормально работать.Наконец, вам нужно добавить значение по умолчанию, если не было выполнено ни одного условия (я использовал NA)

date$dmilk=ifelse(date$del<=100,paste("1",date$dmilk),
                  ifelse(date$del>=100 & date$del<200,paste("2",date$dmilk),
                         ifelse(date$del>=200 & date$del<300,paste("3",date$dmilk),
                                ifelse(date$del>=300,paste("4",date$dmilk), NA))))

Best!

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

Вы можете использовать dplyr case_when:

library(tidyverse)

df <- tibble(
  del = c(
    21, 320, 362, 288, 81, 66, 267, 235, 229, 425, 383, 
    361, 197, 260, 106, 238, 74, 102, 148, 197, 329, 428
  )
)

df <- df %>% mutate(
  dmilk = case_when(
    del > 300 ~ 4,
    del > 200 ~ 3,
    del > 100 ~ 2,
    TRUE      ~ 1
  )
)

df

# A tibble: 22 x 2
     del dmilk
   <dbl> <dbl>
 1    21     1
 2   320     4
 3   362     4
 4   288     3
 5    81     1
 6    66     1
 7   267     3
 8   235     3
 9   229     3
10   425     4
# ... with 12 more rows

Оценка case_when условных вычислений ленива. То есть используется первая действительная запись, поэтому я изменил порядок. Последняя опция TRUE необходима для завершения несогласованных записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...