#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. Как и ожидалось, удар по голове прост.