Причина, по которой ваш рейтинг не соответствует желаемому, заключается в том, что ваш термин yes
включает весь столбец.Таким образом, вам нужно установить столбец в зависимости от вашего состояния.В текущей функции происходит то, что вы ранжируете столбец без фильтра, а затем меняете на NA
все, что не соответствует условию.
Я только что добавил слегка измененную версию вашего кода всделай это.Все, что я изменил, это определил ваше состояние, а затем поместил в таблицу соответствующий кадр.РЕДАКТИРОВАТЬ: это будет работать с отображаемыми данными, но не в том случае, если существует более одной строки, удовлетворяющей условию.
rank_p <- function(x) {
x["rank"] <- NA
cond <- {substr(df$term,1,2) != "ar" &
substr(df$term,1,2) != "ma" &
substr(df$term,1,stop = nchar(df$term)) != "intercept" &
substr(df$term,1, stop = nchar(df$term)) != "Price.Diff" &
df$pval > 0.2}
x$rank <- ifelse(test = cond,
yes = rank(-x[cond, ]$pval, na.last = NA),
no = NA)
return(x)
}
Для этого нужно только ранжировать строки, соответствующие вашему условию (x[cond, ]
).
Это может быть еще более упрощено, потому что вы уже установили их на NA
, просто измените те из них, которые удовлетворяют условию.Не похоже, что вам нужен ifelse
вообще!Это также назначит вектор ранжирования подмножеству такой же длины, которое должно работать для больших наборов, которые содержат более 1 строки, которая удовлетворяет условию.
rank1_p <- function(x) {
x["rank"] <- NA
cond <- {substr(df$term,1,2) != "ar" &
substr(df$term,1,2) != "ma" &
substr(df$term,1,stop = nchar(df$term)) != "intercept" &
substr(df$term,1, stop = nchar(df$term)) != "Price.Diff" &
df$pval > 0.2}
x[cond, "rank"] <- rank(-x[cond,]$pval, na.last = NA)
return(x)
}