R语言数据排序难题一网打尽(dplyr arrange desc高阶用法曝光)

第一章:R语言数据排序核心概念解析

在数据分析过程中,数据排序是基础且关键的操作之一。R语言提供了多种灵活的方法对向量、数据框等结构进行排序,帮助用户快速组织和理解数据分布。

排序的基本函数

R中最常用的排序函数是 sort() 和 order()。前者返回排序后的值,后者返回排序后的索引位置,适用于更复杂的数据结构操作。

# 对向量进行升序排序
data <- c(45, 12, 78, 23, 67)
sorted_data <- sort(data)
print(sorted_data)

# 使用 order() 获取索引并排序数据框
df <- data.frame(id = 1:5, score = c(88, 95, 72, 90, 85))
df_sorted <- df[order(df$score, decreasing = TRUE), ]
上述代码中,order(df$score) 返回按分数升序排列的行索引,结合下标操作即可实现数据框排序。

处理缺失值与排序方向

R语言在排序时会默认将 NA 值置于末尾,但可通过参数控制行为。使用 na.last 参数可调整缺失值位置,而 decreasing 控制升降序。
  • decreasing = TRUE:降序排列
  • na.last = FALSE:将 NA 放在最前
  • na.last = NA:移除 NA 值

多字段排序策略

当需按多个列排序时,可在 order() 中依次传入多个变量。
姓名部门薪资
张三技术15000
李四技术15000
例如,先按“部门”升序,再按“薪资”降序:

df[order(df$department, -df$salary), ]

第二章:dplyr中arrange函数基础与进阶用法

2.1 arrange函数语法结构与默认排序行为

基本语法结构

arrange() 是 dplyr 包中用于数据框排序的核心函数,其基本语法如下:


arrange(.data, ..., .by_group = FALSE)
  • .data:输入的数据框或 tibble;
  • ...:一个或多个排序变量,支持表达式;
  • .by_group:是否按分组进行排序,默认为 FALSE。
默认排序行为

默认情况下,arrange() 按升序排列指定列。若需降序,需结合 desc() 函数使用。


# 按 mpg 升序,再按 cyl 降序
arrange(mtcars, mpg, desc(cyl))

该操作首先确保数据按 mpg 从小到大排列,在 mpg 相同的情况下,再按 cyl 从大到小排序。

2.2 使用desc()实现单变量降序排列实战

在数据分析中,对单个变量进行降序排列是常见的需求。Pandas 提供了 `desc()` 方法结合 `sort_values()` 快速实现该功能。
基本语法与参数说明
df.sort_values(by='column_name', ascending=False)
其中,`by` 指定排序列,`ascending=False` 表示降序。这等价于调用 `desc()` 语义。
实战示例
假设有一个销售数据表:
姓名销售额
张三8000
李四9500
王五7000
执行降序排列:
# 按销售额降序排列
df_sorted = df.sort_values(by='销售额', ascending=False)
结果将李四排在首位,体现最高业绩,便于快速识别关键人员。

2.3 多字段混合排序:升序与降序的组合策略

在处理复杂数据集时,单一字段排序往往无法满足业务需求。多字段混合排序通过组合不同字段的升序与降序规则,实现精细化的数据排列。
排序优先级与方向控制
排序操作按字段声明顺序执行,前一字段值相同时启用下一字段作为“决胜属性”。每个字段可独立指定排序方向,形成灵活的组合策略。
代码示例:JavaScript 多字段排序

const data = [
  { name: 'Alice', age: 25, score: 90 },
  { name: 'Bob', age: 25, score: 95 },
  { name: 'Charlie', age: 30, score: 85 }
];

data.sort((a, b) => 
  a.age - b.age || // 年龄升序
  b.score - a.score // 分数降序(同龄时高分优先)
);
上述代码首先按年龄升序排列,若年龄相同,则按分数降序处理,体现多维度排序逻辑。
常见应用场景对比
场景主字段次字段
电商商品列表销量(降序)价格(升序)
学生成绩单总分(降序)姓名(升序)

2.4 缺失值(NA)在排序中的处理机制与控制技巧

在数据排序过程中,缺失值(NA)的处理直接影响结果的准确性与可解释性。默认情况下,R 和 Python 等语言会将 NA 值置于排序结果的末尾,但这一行为可根据需求调整。
控制 NA 位置的参数机制
以 R 语言为例,sort() 和 order() 函数提供 na.last 参数,用于指定 NA 的位置:

# 示例数据
x <- c(3, 1, NA, 4, NA, 2)

# 默认:NA 放在最后
sorted_default <- sort(x, na.last = TRUE)  # 结果: 1 2 3 4 NA NA

# 将 NA 放在最前
sorted_first <- sort(x, na.last = FALSE)   # 结果: NA NA 1 2 3 4

# 移除 NA
sorted_na_rm <- sort(x, na.last = NA)      # 结果: 1 2 3 4
上述代码中,na.last = TRUE 是默认行为;设为 FALSE 时 NA 被排至开头;设为 NA 则直接剔除缺失值。
多字段排序中的 NA 处理策略
在数据框排序中,需结合 order() 与 is.na() 实现精细控制,确保复合逻辑下的一致性。

2.5 按字符长度或自定义函数间接排序的高级模式

在处理字符串数据时,常需根据字符长度而非字典序进行排序。通过将排序键(key)替换为字符长度,可实现此目的。
基于字符长度的排序
words = ['apple', 'fig', 'banana']
sorted_words = sorted(words, key=len)
# 输出: ['fig', 'apple', 'banana']
该代码利用 len 函数作为 key 参数,使排序依据变为字符串长度。每个元素的长度被计算后用于比较,实现由短到长的排列。
使用自定义函数进行间接排序
更复杂的场景中,可定义函数动态生成排序权重。例如按元音数量排序:
def count_vowels(s):
    return sum(1 for c in s.lower() if c in 'aeiou')

sorted_by_vowels = sorted(words, key=count_vowels)
此模式将排序逻辑抽象为函数,提升灵活性与可维护性,适用于任意衍生排序规则。

第三章:结合管道操作符的数据流排序实践

3.1 利用%>%构建可读性强的链式排序流程

在数据处理中,清晰的代码结构能显著提升可维护性。R语言中的管道操作符 `%>%` 允许将多个操作串联,形成自然语言般的执行流程。
链式操作的优势
通过 `%>%`,数据无需中间变量即可依次传递,避免命名污染并增强逻辑连贯性。

library(dplyr)

data %>%
  arrange(desc(sales)) %>%
  filter(region == "North") %>%
  select(product, sales, date)
上述代码首先按销售额降序排列,筛选北方区域记录,最后提取关键字段。每一步都直接接收前一步结果,语义清晰。
与传统嵌套对比
相比深层嵌套函数,管道风格逐行展开操作,降低认知负担,尤其适用于复杂数据转换场景。

3.2 在group_by后使用arrange进行组内排序

在数据分组后,常需对每组内部记录进行排序。`dplyr` 提供了 `arrange()` 函数,可与 `group_by()` 配合实现组内排序。
执行顺序的重要性
`group_by()` 定义分组结构,而 `arrange()` 按指定列对每组内的行排序。即使先调用 `group_by()`,`arrange()` 仍能作用于组内数据。

library(dplyr)

data <- tibble(
  category = c("A", "A", "B", "B"),
  value = c(3, 1, 4, 2)
)

result <- data %>%
  group_by(category) %>%
  arrange(value)
上述代码首先按 `category` 分组,再在每组内按 `value` 升序排列。最终输出中,每组内的记录均有序,且分组结构得以保留。
排序方向控制
可通过 `desc()` 函数实现降序排列:
  • arrange(value):升序
  • arrange(desc(value)):降序

3.3 排序与其他dplyr动词的协同应用案例

在数据处理流程中,排序常与筛选、聚合等操作结合使用,以增强分析的可读性与逻辑性。通过与`filter()`、`group_by()`和`summarize()`等动词链式调用,可实现复杂但清晰的数据变换。
按分组后排序Top-N记录
例如,提取每个类别中数值最高的前几条记录:

library(dplyr)

data %>%
  group_by(category) %>%
  filter(value == max(value)) %>%
  arrange(desc(value))
该代码先按`category`分组,筛选出每组`value`最大值对应的行,最后按降序排列结果,确保高值优先展示。
排序与汇总结合
在汇总后排序,便于快速识别关键分组:

data %>%
  group_by(region) %>%
  summarize(total_sales = sum(sales)) %>%
  arrange(desc(total_sales))
此流程先计算各区域总销售额,再按金额从高到低排序,直观呈现业绩领先区域。

第四章:常见排序难题与性能优化方案

4.1 数据类型不一致导致的排序异常诊断与修复

在数据库或前端展示中,排序异常常源于字段数据类型不一致。例如,将数值以字符串形式存储会导致“10”排在“2”之前,破坏预期顺序。
典型问题示例
SELECT name, salary FROM employees ORDER BY salary DESC;
若 salary 字段为 VARCHAR 类型,即使内容为数字,排序也会按字典序进行,导致逻辑错误。
诊断方法
  • 检查字段定义:DESCRIBE employees;
  • 验证数据类型是否与业务逻辑匹配
  • 使用 CAST 或 CONVERT 临时修正测试效果
修复策略
ALTER TABLE employees MODIFY COLUMN salary DECIMAL(10,2);
将 salary 从字符串改为数值类型,确保排序符合数学逻辑。修改后,原有“10”<“2”的异常将被纠正。
原始值(VARCHAR)2101
排序结果1102

4.2 大数据集下arrange性能瓶颈分析与应对

在处理百万级数据时,`arrange()` 函数常因全量排序引发内存溢出与响应延迟。核心问题在于其默认使用单线程执行复杂比较操作。
性能瓶颈定位
通过执行计划分析发现,`arrange()` 在无索引支持时会触发磁盘排序(external sort),显著拖慢处理速度。
优化策略
  • 优先利用已排序字段进行分块读取
  • 结合 `dplyr` 的惰性求值机制延迟排序操作
  • 启用多线程后端如 `data.table` 替代实现

# 使用 data.table 实现高效排序
dt[order(column), .SD, by = group]
该代码利用 `data.table` 的快速排序引擎,在大数据集上性能提升可达5倍以上,且内存占用更稳定。

4.3 时间序列与因子顺序的特殊排序需求处理

在量化分析中,时间序列数据的时序一致性与因子计算顺序至关重要。若排序不当,可能导致前瞻偏差或因子逻辑错乱。
时间序列对齐
需确保所有资产的时间索引对齐,缺失值合理填充:
import pandas as pd
# 按日期索引重新对齐
aligned_df = df.reindex(pd.date_range(start=df.index.min(), end=df.index.max(), freq='D'), fill_value=None)
该代码通过 reindex 方法生成连续日期索引,并保留原始数据结构。
因子执行顺序控制
使用依赖关系表明确计算优先级:
因子名称依赖因子执行顺序
MomentumPrice1
VolatilityMomentum2
通过拓扑排序确保无环依赖,保障计算逻辑正确性。

4.4 避免重复排序和冗余操作的最佳实践

在数据处理密集型应用中,重复排序和冗余计算会显著影响性能。通过缓存中间结果和识别可复用的计算路径,能有效减少资源浪费。
缓存已排序结果
对于频繁查询但数据变更不频繁的场景,应缓存排序后的结果,并通过版本标记控制刷新策略:
// 使用时间戳标记数据版本,避免重复排序
type SortedCache struct {
    data      []Item
    version   int64
    sortedAt  int64
}

func (c *SortedCache) GetSorted(now int64) []Item {
    if now - c.sortedAt < 60 { // 60秒内不重新排序
        return c.data
    }
    sort.Slice(c.data, func(i, j int) bool {
        return c.data[i].Score > c.data[j].Score
    })
    c.sortedAt = now
    return c.data
}
上述代码通过时间窗口判断是否需要重新排序,减少了高频调用下的CPU开销。
消除冗余操作的策略
  • 使用唯一标识符合并相同任务
  • 利用惰性求值延迟执行非必要操作
  • 在管道处理中聚合多个变换步骤

第五章:结语——掌握排序艺术,提升数据分析效率

排序算法在真实业务场景中的优化实践
在电商平台的订单处理系统中,每日需对数百万条订单按时间戳进行排序。直接使用内置排序函数会导致性能瓶颈。通过引入归并排序结合时间窗口预分区策略,将整体排序耗时从 12 秒降低至 2.3 秒。
  • 预处理阶段:按小时切分数据块,减少单次排序规模
  • 核心排序:对每个时间块应用归并排序,保证稳定性
  • 合并阶段:利用堆结构实现多路归并,维持全局有序
不同排序策略的性能对比
算法平均时间复杂度空间复杂度适用场景
快速排序O(n log n)O(log n)内存充足、允许非稳定排序
归并排序O(n log n)O(n)大数据集、要求稳定排序
计数排序O(n + k)O(k)整数域有限、分布密集
代码示例:混合排序策略实现

// 当数据量小于阈值时切换为插入排序
func hybridSort(arr []int, low, high int) {
    if low < high {
        if high-low+1 < 10 {
            insertionSort(arr, low, high)
        } else {
            pivot := partition(arr, low, high) // 快速排序划分
            hybridSort(arr, low, pivot-1)
            hybridSort(arr, pivot+1, high)
        }
    }
}
使用`ordered()`函数处理有序变量(R语言) 本文介绍了如何使用ordered()函数处理有序变量,并提供了相应的源代码示例。通过使用ordered()函数,我们可以将普通的变量转换为有序的因子,从而方便进行排序、分组和统计分析。希望本文对你在处理有序变量时有所帮助。如果你还有其他关于R语言或数据分析。希望本文对你在处理有序变量时有所帮助。如果你还有其他关于R语言或数据分析的问题,请随时提问! 阅读详情

相关推荐

使用`ordered()`函数将字符串向量转化为有序的因子向量 - R语言

有时候我们需要将字符串向量转化为有序的因子向量,以便进行排序或者在统计分析中使用。函数可以将字符串向量转化为有序的因子向量,以便进行排序和统计分析。通过指定因子的水平,我们可以定义因子的顺序。在上面的代码中,我们指定了因子的水平为"Low"、“Medium"和"High”,即按照这个顺序对字符串向量进行排序。已经成功地转化为有序的因子向量,并且按照"Low" < “Medium” < "High"的顺序进行了排序。函数将字符串向量转化为有序的因子向量,并提供相应的源代码示例。显示了每个因子水平的频数。

2301_79330513的博客 465

PSIM-三相维也纳VIENNA整流器电压电流双闭环+中点电位平衡SVPWM控制仿真

内容概要:本文档详细介绍了一种基于PSIM软件实现的三相维也纳(VIENNA)整流器仿真模型,重点实现了电压电流双闭环控制与中点电位平衡的SVPWM调制策略。该仿真系统通过精确的控制算法有效提升了整流器的功率因数,降低了输入电流谐波含量,并解决了三电平拓扑中常见的直流侧中点电位偏移问题,具有较高的工程实用价值,适用于高效率、高功率密度的电力电子系统设计与科研验证。文档还整合了丰富的配套资源,涵盖多种电力电子变换器拓扑结构、先进控制算法及典型应用场景,形成了系统化的技术资料体系,有助于深入理解现代整流技术的核心原理与发展动态。; 适合人群:面向从事电力电子、电气工程、新能源变换系统等领域的科研人员、高校研究生以及具备一定仿真基础的工程技术人员。; 使用场景及目标:①深入研究三相VIENNA整流器的工作机理与控制特性;②掌握电压外环、电流内环双闭环控制结构的设计方法;③理解并实现SVPWM调制技术与中点电位平衡控制策略的协同作用;④开展相关控制算法的仿真验证、性能优化与实验对比,为高性能整流装置的研发提供理论支撑和技术原型。; 阅读建议:建议结合文中列出的其他仿真案例(如PWM整流器、LLC谐振变换器、DAB变换器等)进行横向对比学习,充分利用所提供的PSIM、MATLAB/Simulink等多平台仿真资源,重点关注控制逻辑与主电路的耦合关系,通过参数调试与波形分析深化对系统动态响应和稳态性能的理解,强化“理论—建模—仿真—优化”的闭环研究能力。

SpringBoot+Vue+Mysql社区医院信息平台(源码+文档)

SpringBoot+Vue+Mysql学生宿舍信息管理系统 WEB端软件项目(源码+文档) 项目包含:①完整源码(后端+管理后台+用户前台);②数据库脚本文件;③万字论文文档;④开题报告;⑤答辩PPT;⑥项目运行视频教程。 项目架构: B/S 架构、MVC 分层设计 技术栈: Java、MySQL、SpringBoot、MyBatis-Plus、Token 权限校验、管理后台 Vue+ElementUI+ECharts、用户前台 Layui+jQuery、Maven 构建。 一、角色设计 学生用户: 注册登录、浏览宿舍信息、查询宿舍安排、在线报修、缴费查询、失物招领、桶装水预订、评论交流、收藏等。 商家用户: 注册登录、桶装水品牌与商品信息维护、预订订单查看与处理。 维修人员: 注册登录、查看待处理报修、接单维修、填写报修处理结果与进度反馈。 管理员: 学生管理、班级管理、宿舍信息管理、宿舍安排管理、报修处理管理、缴费信息管理、卫生检查与文明宿舍管理、失物招领管理、桶装水与商家管理、维修人员管理、公告资讯与轮播图管理等。 二、前台功能模块(学生端) 1. 首页展示:轮播图、宿舍公告、最新动态推荐、常用服务快速入口 2. 宿舍信息模块:宿舍列表、楼栋与房间条件筛选、宿舍详情查看、我的宿舍安排查询 3. 在线报修模块:在线提交宿舍设施报修申请、上传故障描述、查看报修进度与维修处理结果 4. 缴费模块:水电等缴费记录查询、缴费状态查看 5. 卫生检查与文明宿舍:宿舍卫生检查结果公示、文明宿舍展示 6. 失物招领模块:失物信息发布、招领信息发布、详情查看、评论互动 7. 桶装水预订:桶装水品牌与商品浏览、在线预订、我的预订记录查询 8. 假期留宿:假期留校申请提交、申请记录查询 9. 评论与收藏:信息评论、查看他人评论、评论回复互动、收藏感兴趣的内容 10. 个人中心...

产业园区运营负责人如何利用数智工具提升园区企业的技术对接效率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

YOLOv8作物病害检测实战源码

这是一套基于YOLOv8n的农田病虫害目标检测系统,对叶片照片做目标检测,识别健康叶片、褐斑病、白粉病、锈病四类,并给出对应防治建议。全流程纯CPU可跑,配套交付完整Python源码、9章实战教程(md/html/pdf三种格式)、100张自造样本及YOLO标签、训练曲线与混淆矩阵截图、Tkinter界面和答辩PPT。 系统围绕五项功能展开:同一套推理逻辑覆盖图像、视频、摄像头三种来源;图形界面选文件即检测,画面叠彩色框标注病名与置信度,右侧面板同步给出症状与防治措施;检测记录自动写入CSV,统计页一键生成四类病害占比饼图;训练结束自动产出损失与精度曲线;内置防治建议文案库,检测命中即回填面板。 选型用YOLOv8n nano档,参数量约320万、权重约6.2MB,CPU单帧几十毫秒,小样本训练5到8分钟完成。数据由data_gen.py程序化绘制100张叶片图,固定随机种子,重跑分布一致,不依赖公开数据集。依赖全部锁版本,教程第7章整理了19条真实报错及排查方法,第8章给出换模型档、换PlantVillage数据集的迁移路径。 适合做计算机视觉方向课程设计或毕业设计的学生,也适合智慧农业方向想了解检测模型如何落进业务面板的学习者。不需要GPU,不需要系统学过目标检测,教程第3章会按需补齐原理。 使用时先pip install -r requirements.txt装好依赖,download_data.py下载预训练权重,data_gen.py生成样本后train.py训练,完成后用main.py infer批量检测或main.py gui启动界面。

数据挖掘实战:决策树 + 聚类 + 关联规则,零 Key 离线可跑(Python 源码)

数据挖掘实战包。用 Python 标准库实现 CART 风格决策树、K-Means 聚类与 Apriori 关联规则,在虚构「星河便利店」会员表和购物篮上跑通分类、分群与购物篮分析,并给出准确率、轮廓系数、支持度/置信度/提升度。零第三方依赖、零 API Key 即可离线跑通。含 4 个样例、离线冒烟、中文 README(含「使用方法」)。均为作者原创可运行源码。MIT。作者 blog.youkuaiyun.com/mtl1994

ICD10 openGauss版

ICD10 openGauss版

科技中介服务机构在技术供需对接中如何实现服务流程的自动化与标准化?.docx

科技中介服务机构在技术供需对接中如何实现服务流程的自动化与标准化?

产业园区运营负责人如何利用平台实现企业创新需求的精准分析与服务推送?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

产业园区如何高效对接企业技术需求与高校科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

国央企创新负责人如何快速掌握本地科技资源分布与匹配情况?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

高校技术转移办公室人员在推动成果转化落地过程中,如何实现科技成果的高效推介与价值评估?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

国央企创新负责人如何实现科技成果的精准识别与高效筛选?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

科技中介服务机构如何通过数智工具提升技术需求挖掘的精准度?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

高校技术转移办公室人员如何系统化管理科技成果信息?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

科技中介服务机构如何构建标准化、模块化的智能服务工具?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

政府科技管理者如何在政策支持中更精准地识别和支持高价值科技项目?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

fab-pm-optimizer-python-entry-py39-20261021-v1-1-0

fab-pm-optimizer-python-entry-py39-20261021-v1-1-0

上一篇: R Shiny弹窗太小内容溢出?教你4步完美调整modalDialog尺寸
下一篇: silhouette系数为0.3还能接受吗?90%数据科学家忽略的关键阈值真相
VarPerch
博客等级 码龄1年 146粉丝 1961原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值