R语言基于数值变量排名为另一变量赋值标记观测/未观测状态
报错原因说明
dplyr::top_n()的第一个参数要求是数据框,你第一次尝试直接传入data$x数值向量,触发了类型不匹配报错。- 后两次尝试参数顺序错误,
top_n()的参数顺序为top_n(数据框, 筛选行数, 排序列),你把列名x放到了第二个本应传入数值n的位置,导致函数把整列x的值当做n判断,触发了长度大于1的警告。 - 另外
top_n()返回的是筛选后的子数据框,不是单独的排序列数值,不能直接和data$x做等值比较。
可行解决方案
方案1:纯dplyr语法实现(推荐,逻辑清晰无匹配误差)
直接通过排名逻辑标记,不需要单独做值匹配:
library(dplyr) n_rows <- 20 n_observed <- 5 # 生成数据+打标记一步完成 data <- data.frame( x = rnorm(n_rows), status = rep("unobserved", n_rows) ) %>% mutate( # 按x从大到小排名,前n_observed行标记为已观测 status = if_else(row_number(desc(x)) <= n_observed, "observed", status) )
如果要标记x最小的n个为观测,去掉desc()即可。
方案2:修正原有赋值逻辑的写法
如果你习惯用基础R的赋值方式,可以调整top_n的调用方式:
# 先拿到top n的x值向量 top_x_vals <- dplyr::top_n(data, n = n_observed, wt = x)$x # 匹配赋值 data$status[data$x %in% top_x_vals] <- "observed"
注意:如果x存在重复值,该写法会把所有等于top区间值的行都标记为已观测,最终观测数可能大于你设定的n_observed,如果严格要求固定观测数建议使用方案1。
内容的提问来源于stack exchange,提问作者WinzarH
相关产品推荐
相关产品推荐

