如何在R语言中对dataP数据框指定列按从小到大排序
需求
需要对表格中的变量X以及Y\X=8对应的变量值按从低到高重新排序,最终排序后的变量值需为:6、8、9、10。
生成目标表格
dataP的代码 lim <- sample(2:10, 4) lim1 <- sample(3:10, 4) create_table <- function() { n_a <- sample(10:25,1) n_b <- 30-n_a n_c <- sample(5:18,1) n_d <- 20-n_c P3 <- rmultinom(1, n_a, prob=c(0.2, 0.4, 0.3, 0.1)) P4 <- rmultinom(1, n_b, prob=c(0.1, 0.2, 0.4, 0.3)) P5 <- rmultinom(1, n_a, prob=c(0.2, 0.4, 0.3, 0.1)) P6 <- rmultinom(1, n_b, prob=c(0.1, 0.2, 0.4, 0.3)) matrix(c(P3, P4, P5, P6), nrow = 4, ncol = 4, dimnames = list(c(lim[1], lim[2] ,lim[3],lim[4]), c(lim1[1] ,lim1[2], lim1[3], lim1[4]))) } public <- create_table() r <- sample(1:4,1) dataP <- data.frame(c(lim1[1], lim1[2], lim1[3], lim1[4], "Suma"), c(public[r,1], public[r,2], public[r,3], public[r,4],public[r,1]+ public[r,2]+ public[r,3]+public[r,4])) colnames (dataP) <-lapply(list( "Y\\X={states[[1]][r]}","n[i/j == paste( {ansord})]" ),glue)
尝试的排序代码
dataP[order(suppressWarnings(as.numeric(dataP$`X\\Y=`)), na.last = TRUE),]
修正后的解决方案
你的尝试存在两个核心问题:一是列名引用错误(实际列名是Y\\X={...}而非X\\Y=),二是没有按指定的目标顺序(6、8、9、10)精准排序,同时未妥善处理汇总行"Suma"。
以下是精准匹配目标顺序的排序代码:
# 提取汇总行 suma_row <- dataP[dataP[[1]] == "Suma", ] # 按目标顺序匹配行,生成排序后的主体行 sorted_main <- dataP[match(c(6, 8, 9, 10), dataP[[1]]), ] # 拼接主体行与汇总行,得到最终排序后的表格 dataP_sorted <- rbind(sorted_main, suma_row)
关键说明
match(c(6,8,9,10), dataP[[1]]):直接根据你指定的目标顺序,在表格第一列中匹配对应值的行索引,确保排序结果严格符合要求- 单独提取并保留"Suma"行在末尾,避免排序逻辑影响汇总数据
- 无需依赖自动排序函数,直接指定顺序匹配,结果更可控
内容的提问来源于stack exchange,提问作者Amelia
相关产品推荐
相关产品推荐

