Измените значение символа переменной на основе числового ранга другой переменной

#r #dplyr

Вопрос:

Используя моделирование, я хочу протестировать/ продемонстрировать эффекты «цензурированных» данных, когда некоторые случаи недоступны для нас или имеют значения, выходящие за пределы диапазона измерений наших приборов.

Здесь я хочу обозначить случаи как «наблюдаемые» или «ненаблюдаемые» на основе оценки ранга числовой переменной.

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

 ## generate some data n_rows lt;- 20  x lt;- rnorm(n_rows) status lt;- rep("unobserved", n_rows) data lt;- data.frame(x, status)  library(dplyr)  ## how many observed cases? n_observed lt;- 5   ## Failure #1 data$status[data$x == dplyr::top_n(data$x, n_observed)] lt;- "observed"  #gt; Error in UseMethod("tbl_vars"): no applicable method for 'tbl_vars' applied to an object of class "c('double', 'numeric')"   ## Failure #2 data$status[which((data$x == dplyr::top_n(data, x, n_observed)))] lt;- "observed"  #gt; Warning in if (n gt; 0) {: the condition has length gt; 1 and only the first element will be used   ## Failure #3 data$status[top_n(data, x, n_observed) %in% data] lt;- "observed"  #gt; Warning in if (n gt; 0) {: the condition has length gt; 1 and only the first element will be used   

Ответ №1:

Если вам нужны звания, то используйте rank ! Вот два примера, в которых отдельно присваивается статус наблюдения верхним и нижним пяти ранжированным значениям x .

 data lt;- data.frame(x = sample(20), status1 = "unobserved", status2 = "unobserved") data$status1[rank(data$x) lt;= 5] lt;- "observed" data$status2[rank(-data$x) lt;= 5] lt;- "observed" data  
 x status1 status2 1 2 observed unobserved 2 11 unobserved unobserved 3 3 observed unobserved 4 4 observed unobserved 5 14 unobserved unobserved 6 15 unobserved unobserved 7 1 observed unobserved 8 8 unobserved unobserved 9 7 unobserved unobserved 10 20 unobserved observed 11 13 unobserved unobserved 12 16 unobserved observed 13 9 unobserved unobserved 14 10 unobserved unobserved 15 17 unobserved observed 16 5 observed unobserved 17 18 unobserved observed 18 19 unobserved observed 19 12 unobserved unobserved 20 6 unobserved unobserved  

Вам придется быть немного более осторожным, если вы ожидаете x , что в нем будут дубликаты. rank имеет необязательный аргумент ties.method , который вы можете использовать для указания поведения в этом случае.

Как вы, вероятно, поняли из предупреждений, dplyr::top_n предназначен для «фрейм данных входит, фрейм данных выходит». Его не следует использовать для индексации.

Комментарии:

1. Очень признателен, @MikaelJagan. Как и ожидалось, удар по голове прост.