数据清洗提速10倍,你不知道的across多列操作秘密

第一章:数据清洗提速10倍,你不知道的across多列操作秘密

在处理大规模数据集时,传统逐列清洗方式往往效率低下。而利用 `dplyr` 中的 `across()` 函数,可以实现对多列批量、一致地应用转换逻辑,大幅提升数据清洗效率。

across函数的核心优势

  • 统一操作多个列,避免重复代码
  • 结合 `mutate()` 和 `summarise()` 实现灵活变换
  • 支持条件筛选列(如数值型、字符型)进行针对性处理

实际应用场景示例

假设我们有一个销售数据框,包含多个以 "_rate" 结尾的比率字段,这些字段中存在百分比字符串(如 "85%"),需要转为数值型。

library(dplyr)

# 示例数据
sales_data <- data.frame(
  region = c("A", "B"),
  q1_rate = c("85%", "90%"),
  q2_rate = c("78%", "NaN"),
  q3_rate = c("92%", "88%")
)

# 使用 across 批量清洗百分比列
cleaned_data <- sales_data %>%
  mutate(
    across(
      ends_with("_rate"),           # 选择以 _rate 结尾的列
      ~ as.numeric(gsub("%", "", .)) / 100,  # 去除%并转为小数
      .names = "{col}_cleaned"      # 输出新列名格式
    )
  )

print(cleaned_data)
上述代码中,`across()` 配合 `mutate()` 对所有匹配列执行匿名函数:先用 `gsub` 移除百分号,再转换为数值并除以 100 标准化。`.names` 参数自定义输出列名,便于后续使用。

性能对比参考

方法处理时间(ms)代码行数
逐列操作12012
across批量处理125
通过向量化多列操作,`across()` 不仅将执行速度提升近10倍,还显著降低了维护成本。

第二章:across函数核心原理与语法解析

2.1 across函数的基本结构与参数详解

across 是 dplyr 包中用于在多个列上应用统一操作的核心函数,常与 mutatesummarise 等动词结合使用。

基本语法结构
across(.cols, .fns, .names = NULL)

该结构允许用户指定目标列、处理函数及输出列名模板。

参数说明
  • .cols:选择要操作的列,支持列名、位置或逻辑表达式(如 is.numeric);
  • .fns:应用的函数,可为单个函数、函数列表或匿名函数;
  • .names:自定义输出列名,使用 {col}{fn} 占位符生成新名称。
示例与分析
df %>% mutate(across(is.character, toupper))

此代码将数据框中所有字符型列的值转换为大写,展示了类型筛选与函数广播的结合能力。

2.2 如何结合select辅助函数精准筛选列

在数据处理过程中,精准选择所需列是提升性能和可读性的关键。`select` 辅助函数允许开发者通过声明式语法灵活选取、重命名或计算新列。
基础列筛选
使用 `select` 可以从数据集中提取指定字段,减少冗余数据传输。
df_selected = df.select("name", "age", "email")
该操作仅保留用户关注的三列,适用于数据预处理阶段的字段精简。
结合函数进行列变换
`select` 支持与内置函数组合,实现动态列生成:
from pyspark.sql.functions import upper
df_upper = df.select(upper("name").alias("NAME"))
此处将 `name` 列转为大写并重命名为 `NAME`,展示了函数嵌套与别名机制的协同能力。 通过字段筛选与表达式计算的结合,`select` 成为构建高效数据流水线的核心工具。

2.3 使用across实现多列统一变换的理论基础

在数据处理中,常需对多个列执行相同函数操作。`across()` 提供了一种声明式语法,将函数应用于选定列集合,保持结构一致性。
核心机制
`across()` 结合选择器(如 `starts_with()`)与函数(如 `mean`),批量处理列。其本质是列映射变换。

mutate(df, across(where(is.numeric), ~ .x - mean(.x)))
上述代码对所有数值列进行中心化:`where(is.numeric)` 识别目标列,`~ .x - mean(.x)` 为变换逻辑,`.x` 代表当前列值。
  • 输入一致性:所有列需兼容变换函数
  • 输出对齐:结果保持原行列结构
该机制建立在函数式编程与列式向量化基础上,提升代码复用性与可读性。

2.4 常见错误用法剖析与性能陷阱规避

不当的同步机制导致性能下降
在高并发场景中,过度使用锁机制会显著降低系统吞吐量。例如,以下 Go 代码展示了不必要地对整个函数加锁:

var mu sync.Mutex
var cache = make(map[string]string)

func Get(key string) string {
    mu.Lock()
    defer mu.Unlock()
    return cache[key]
}
该实现每次读取都需获取互斥锁,即使数据未变更。应改用读写锁 sync.RWMutex,允许多个读操作并发执行,仅在写入时阻塞。
资源泄漏与连接池配置失误
数据库连接未正确释放将导致连接耗尽。常见错误包括忘记调用 rows.Close() 或异常路径遗漏资源回收。
  • 始终使用 defer rows.Close() 确保清理
  • 合理设置连接池最大空闲数与生命周期
  • 避免短时间高频创建新连接

2.5 从for循环到向量化:across背后的效率革命

在数据处理中,传统的 for 循环因逐行迭代而效率低下。向量化操作通过底层并行计算,一次性处理整个数组,显著提升性能。
传统循环的瓶颈
  1. 逐元素访问带来高开销
  2. 难以利用CPU SIMD指令集
  3. 解释型语言中循环解释成本高
向量化优势示例

# 传统方式
for (i in 1:nrow(df)) {
  df$result[i] <- df$a[i] + df$b[i]
}

# 向量化方式
df$result <- df$a + df$b
上述代码中,向量化版本直接对整列执行加法,由底层C/R引擎优化执行,速度提升可达数十倍。运算不再受限于R的解释循环,而是交由高效编译代码处理,体现 across() 等函数背后的设计哲学。

第三章:across在典型数据清洗场景中的应用

3.1 批量处理缺失值:na_if与replace组合实战

在数据清洗过程中,统一不同形式的缺失值是关键步骤。使用 `na_if()` 与 `replace()` 函数组合,可高效将特定值批量转换为 NA。
常见缺失标识识别
实际数据中,“NULL”、“N/A”、“missing”等字符串常被误作有效值。通过逻辑判断定位这些异常标识,是清洗前提。
函数组合应用示例

library(dplyr)
data %>% 
  mutate(across(everything(), ~ na_if(., "NULL"))) %>%
  mutate(across(everything(), ~ replace(., . == "N/A", NA)))
上述代码首先利用 na_if() 将所有“NULL”替换为NA,再通过 replace() 处理“N/A”。across(everything()) 确保操作覆盖全部列,实现批量处理。 该方法适用于大规模数据预处理,显著提升清洗效率与一致性。

3.2 多列类型转换:字符转日期、因子转数值统一操作

在数据预处理中,批量列的类型转换是提升分析效率的关键步骤。针对字符型日期和因子型数值字段,需进行系统性转换。
批量字符转日期
使用 lubridate 结合 dplyr 可高效处理多列日期转换:

library(dplyr)
library(lubridate)

data %>% mutate(across(
  ends_with("_date"), 
  ~ymd(.x)
))
across 函数筛选以 "_date" 结尾的列,ymd() 统一解析为日期格式,适用于 "2023-01-01" 类字符串。
因子转数值统一操作
对于多个因子列需转为数值的情形:

data %>% mutate(across(
  where(is.factor), 
  ~as.numeric(as.character(.x))
))
where(is.factor) 定位所有因子列,双重转换确保安全转为数值型,避免直接 as.numeric 引发的索引误读。

3.3 标准化与归一化:跨列缩放数值特征的高效写法

在机器学习预处理中,标准化(Standardization)和归一化(Normalization)是消除量纲差异的关键步骤。合理缩放特征可加速模型收敛并提升性能。
常用方法对比
  • 标准化:将数据转换为均值为0、标准差为1的分布,适用于特征分布近似正态的情况。
  • 归一化:将数据缩放到[0, 1]或[-1, 1]区间,适合有明显边界或稀疏数据场景。
向量化实现示例
import numpy as np

def scale_features(X, method='standard'):
    if method == 'standard':
        mean = np.mean(X, axis=0)
        std = np.std(X, axis=0)
        return (X - mean) / std
    elif method == 'minmax':
        min_val = np.min(X, axis=0)
        max_val = np.max(X, axis=0)
        return (X - min_val) / (max_val - min_val)
上述代码利用NumPy的广播机制,对每一列特征独立计算统计量并进行批量变换,避免循环,显著提升处理效率。参数axis=0确保按列操作,符合特征维度一致性要求。

第四章:进阶技巧提升数据处理效率

4.1 结合group_by实现分组内多列同步变换

在数据处理中,常需按某一维度分组后对多个字段进行协同变换。使用 `group_by` 可将数据划分为逻辑组,进而实现组内列间的联动计算。
同步变换场景
例如,在销售数据中按“区域”分组,同时对“销售额”做累加、“完成率”做标准化:

df.groupby('区域').apply(lambda g: pd.DataFrame({
    '累计销售额': g['销售额'].cumsum(),
    '归一化完成率': (g['完成率'] - g['完成率'].min()) / 
                    (g['完成率'].max() - g['完成率'].min())
}).reset_index(drop=True))
该代码通过 `group_by` 分组后,在每组内部同步生成两个新列。`cumsum()` 实现组内累积,归一化公式确保指标在同一量纲。`apply` 返回 DataFrame 保持结构扁平,适用于后续分析流程。

4.2 使用across与case_when进行批量条件赋值

在数据处理中,常需对多个变量进行统一的条件赋值操作。结合 `across()` 与 `case_when()` 可高效实现这一目标。
核心函数解析
  • across():应用于 dplyr 中,支持对多列批量操作;
  • case_when():提供向量化条件判断,类似 SQL 的 CASE WHEN。
代码示例

df %>%
  mutate(across(
    starts_with("score"), 
    ~ case_when(
      .x >= 90 ~ "A",
      .x >= 80 ~ "B",
      TRUE ~ "C"
    )
  ))
上述代码对所有以 "score" 开头的列进行评级赋值。`across()` 遍历匹配列,`case_when()` 按顺序逐行判断并返回对应等级。`.` 表示当前列元素,`TRUE ~ "C"` 作为默认分支确保全覆盖。这种组合显著提升多列条件处理效率。

4.3 自定义函数注入:封装逻辑复用处理规则

在复杂的数据处理流程中,自定义函数注入是实现逻辑复用的核心手段。通过将通用处理规则封装为独立函数,可在多个处理节点中动态调用,提升代码可维护性与执行效率。
函数封装示例

// TransformUserData 封装用户数据标准化逻辑
func TransformUserData(input map[string]interface{}) map[string]interface{} {
    output := make(map[string]interface{})
    output["id"] = input["user_id"]
    output["name"] = strings.ToUpper(input["username"].(string))
    output["created_at"] = time.Now().Unix()
    return output
}
该函数接收原始用户数据,统一转换字段命名、格式化名称并注入时间戳,适用于多源数据归一化场景。
注册与调用机制
  • 函数需预先注册至执行引擎的函数池
  • 运行时通过名称动态解析并注入上下文
  • 支持参数校验与异常捕获,保障执行安全

4.4 与ifelse、coalesce等函数嵌套优化表达式

在复杂查询逻辑中,合理使用 ifelsecoalesce 可显著提升表达式的可读性与执行效率。通过嵌套组合,能够实现多层条件判断的简洁表达。
嵌套函数的典型应用场景
当需要按优先级处理多个可能为空的字段时,coalesce 非常适用;而 ifelse 则适合布尔条件分支控制。二者结合可构建灵活的数据清洗规则。
SELECT 
  coalesce(
    ifelse(status = 'active', user_name, NULL),
    'anonymous'
  ) AS display_name
FROM users;
上述语句首先判断用户状态是否为 active,若是则返回用户名,否则返回 NULL;最终由 coalesce 捕获 NULL 值并替换为默认值 'anonymous'。这种结构避免了冗长的 CASE 表达式,提高了代码紧凑性。
  • ifelse(condition, true_val, false_val):三元逻辑控制
  • coalesce(val1, val2, ...):返回第一个非空值

第五章:总结与展望

技术演进中的架构选择
现代后端系统在微服务与单体架构之间需权衡取舍。以某电商平台为例,其订单模块从单体中剥离为独立服务时,引入gRPC进行通信,显著降低了延迟:

// 订单服务接口定义
service OrderService {
  rpc CreateOrder(CreateOrderRequest) returns (CreateOrderResponse);
}

message CreateOrderRequest {
  string user_id = 1;
  repeated Item items = 2;
}
可观测性实践升级
分布式环境下,日志、指标与链路追踪缺一不可。某金融系统采用OpenTelemetry统一采集数据,上报至Prometheus与Jaeger。关键配置如下:
  • 通过OTLP协议实现多后端兼容
  • 设置采样率避免性能损耗
  • 结合Grafana构建实时监控看板
未来能力扩展方向
技术方向应用场景实施建议
Serverless函数计算突发流量处理结合Knative实现自动伸缩
边缘计算网关物联网设备接入部署轻量级Envoy代理
[API Gateway] --(HTTP/gRPC)--> [Auth Service] \--> [Rate Limiter] --> [Service Mesh]
内容概要:本文围绕“基于改进滑模控制的永磁同步电机调速系统模型研究”展开,重点介绍在Simulink环境中构建和仿真永磁同步电机(PMSM)调速系统的方法,采用改进滑模控制策略以提升系统鲁棒性与动态性能。文中系统阐述了控制算法的设计原理、系统建模流程、关键模块搭建及仿真结果分析,旨在复现高水平科研成果(SCI/EI级别),并通过仿真实验验证所提控制策略的有效性。该研究属于电机控制与电力电子领域的前沿方向,对高精度伺服系统、新能源汽车电驱动系统等实际应用场景具有重要的理论指导和工程参考价值; 适合人群:具备自动控制理论基础和Simulink/MATLAB仿真能力,从事电气工程、自动化、电力电子等相关专业的研究生、科研人员及工程技术人员,尤其适合致力于复现高水平学术论文成果的研究者; 使用场景及目标:①深入学习永磁同步电机矢量控制与滑模变结构控制的核心原理与建模方法;②复现并理解SCI/EI期刊中先进电机控制算法的技术细节;③开展电机控制系统仿真研究,优化控制参数,提升系统抗干扰能力、稳态精度与动态响应性能; 阅读建议:建议结合文中提及的完整资源包(含Simulink模型、MATLAB代码、详细说明文档)进行实践操作,重点关注控制策略的实现逻辑与仿真调试过程,注重理论推导与仿真实验相结合,同时参考同类高水平研究以拓展技术视野。
内容概要:本文提出了一种基于数据驱动的Koopman算子与递归神经网络(RNN)相结合的模型线性化方法,旨在解决纳米定位系统中因强非线性、迟滞和蠕变效应导致的建模困难问题。该方法通过Koopman算子将非线性动态系统映射至高维线性空间,利用RNN学习系统的时间序列演化特征,从而实现对复杂动态行为的精确建模与预测,并进一步集成于模型预测控制(MPC)框架中,显著提升了纳米定位系统的控制精度、动态响应能力与运行稳定性。整个算法体系在Matlab平台上完成代码实现与仿真实验验证,展示了良好的控制性能与工程应用潜力。; 适合人群:具备控制理论、非线性系统建模、机器学习及智能控制基础,从事精密仪器控制、高端制造装备研发、自动化系统设计等领域的研究生、科研人员及工程技术开发者。; 使用场景及目标:①应对扫描探针显微镜、光刻机、超精密加工平台等纳米级定位设备中的非线性建模挑战;②提升高精度运动系统的实时预测控制性能,抑制迟滞与蠕变带来的定位误差;③为数据驱动的非线性系统线性化与先进控制策略(如MPC)的融合提供可复现、可扩展的技术范例。; 阅读建议:建议读者结合提供的Matlab代码,深入理解Koopman观测矩阵构造、RNN网络训练流程及MPC控制器设计之间的协同机制,重点关注数据预处理、特征提取、模型训练与闭环控制仿真的完整链路,以便在相似高精度控制系统中进行迁移与优化应用。
内容概要:本文系统研究了基于动态三维环境下的Q-Learning算法在无人机自主避障路径规划中的应用,旨在通过强化学习实现无人机在复杂、动态空间中的智能决策与安全飞行。研究构建了完整的Q-Learning模型框架,涵盖状态空间定义、动作策略设计与奖励函数构建,重点提升了算法在存在移动障碍物场景下的路径规划能力与实时避障性能。通过Matlab仿真平台实现了算法的全流程建模与验证,展示了其在路径最优性、环境适应性与运行稳定性方面的优势,并为后续多机协同、城市密集环境等高级应用场景提供了可扩展的技术基础与代码支持。; 适合人群:具备一定编程基础和控制理论知识,从事无人机导航、智能优化算法或强化学习相关研究的科研人员及研究生。; 使用场景及目标:① 掌握Q-Learning算法在三维动态路径规划中的建模与实现方法;② 学习如何将强化学习技术应用于实际工程问题如无人机自主避障;③ 为深入研究多智能体协同、复杂非结构化环境下的路径规划提供算法原型与仿真基础; 阅读建议:建议读者结合提供的Matlab代码进行仿真实验,深入理解状态表示与奖励机制的设计逻辑,尝试调整算法参数或引入新的动态障碍物模式以评估鲁棒性,并可进一步对比其他智能算法(如DQN、A*、DWA等)在相同环境下的性能差异。
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 微信小程序商城 微信小程序商城,微信小程序微店,长期维护版本,欢迎大家踊跃提交贡献代码; 使用说明和常见问题,可参阅下面的说明,如还有疑问,可访问工厂官网 https://www.it120.cc/ 寻求帮助! 新增直播带货支持,具体详见使用说明 今日头条/抖音小程序版本 本项目的今日头条/抖音小程序版本,请移步至下面的地址: https://.com/EastWorld/tt-app-mall 扫码体验 详细配置/使用教程 https://www.it120.cc/help/ikfe2k.html 遇到使用问题? 点击这里找答案,可用关键词搜索 其他优秀开源模板推荐 天使童装 / 码云镜像 / GitCode镜像 天使童装(uni-app版本) / 码云镜像 / GitCode镜像 简约精品商城(uni-app版本) / 码云镜像 / GitCode镜像 舔果果小铺(升级版) 面馆风格小程序 AI名片 / 码云镜像 / GitCode镜像 仿海底捞订座排队 (uni-app) / 码云镜像 / GitCode镜像 H5版本商城/餐饮 / 码云镜像 / GitCode镜像 餐饮点餐 / 码云镜像 / GitCode镜像 企业微展 / 码云镜像 / GitCode镜像 无人棋牌室 / 码云镜像 / GitCode镜像 酒店客房服务小程序 / 码云镜像 / GitCode镜像 面包店风格小程序 / 码云镜像 / GitCode镜像 朋友圈发圈素材小程序 / 码云镜像 / GitCode镜像 小红书企业微展 / 码云镜像 / GitCode镜像 旧物回收、废品回收 / 码云镜像 / ...
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 在电子数据通信领域中,串口通信光耦隔离电路是一种被广泛应用的电路设计方案。该方案借助光耦合器(optocoupler)达成电路的电气隔离,进而保障通信的稳定性和安全性。在此之后,我们将详细研究串口通信中的光耦隔离技术、电路构造,以及与波特率和误码率之间的相互联系。光耦合器是一种通过光信号传递电信号的半导体装置,它一般包含一个发光二极管(LED)和一个光敏三极管或其他类型的光敏单元。当LED受到电信号驱动时,它会发出光,该光信号随后被光敏元件捕获并转化为电信号,由此实现电平的隔离。在串口通信电路构造中,光耦合器的主要功能是将微处理器等发送部分与接收部分分隔开来。这种隔离措施能够有效防止两部分电路之间的电气干扰,并在一定程度上增强系统的抗干扰性能。比如,当发送端设备遭遇雷击或其他高压冲击时,光耦隔离能够使接收端设备免于受损。光耦隔离电路通常应用于RS232、RS485等串行通信接口,目的是确保信号在传输期间受电势差、电流、噪声等外部因素的良影响。在采用光耦隔离技术时,必须特别关注信号的速率,即波特率。波特率是衡量串口通信中信号传输速度的单位,它表示每秒钟能够传输的信号元素(如位)的多少。在构建光耦隔离电路时,必须将光耦合器的传输速率纳入考量。由于光耦合器的响应周期和传输延迟,采用光耦合器的隔离电路或许无法应对过高的波特率。高波特率代表着更高的信号频率,这可能会导致光耦合器无法及时准确地解析信号,从而造成误码率增加,影响数据传输的精确度。因此,在构建串口通信光耦隔离电路时,应审慎挑选合适的光耦合器和电路构造,以确保在可接受的误码率范围内进行数据通信。在选择光耦合器时,应参照其最...
内容概要:本文系统阐述了频域视角下的风险溢出网络研究,重点聚焦从Diebold-Yilmaz(DY)溢出指数到Baruník-Křehlík(BK)溢出指数的理论演进与实证实现。BK方法通过傅里叶变换将风险溢出效应分解至同频率成分,从而能够精细识别金融市场间短期冲击与长期趋势的风险传导机制,显著提升了对系统性金融风险动态结构的理解能力。文中配套提供了完整的Matlab代码实现流程与实际案例分析,涵盖谱密度矩阵估计、广义方差分解及频域权重计算等关键步骤,帮助读者掌握从数据处理到结果可视化与经济解释的全过程。; 适合人群:具备扎实计量经济学基础和良好Matlab编程能力的高校研究生、博士生及金融领域科研人员,特别适用于从事金融风险管理、资产定价、宏观经济与金融市场联动性研究的学者,以及希望将前沿量化工具应用于实证分析的金融从业者。; 使用场景及目标:①用于学术研究中构建高频与低频风险溢出网络,深入剖析同投资周期下市场间的传染路径与主导关系;②辅助监管机构和政策制定者识别系统性风险的源头、传播渠道与时变特征,提升宏观审慎监管的精准性与时效性;③作为高级金融计量学或实证资产定价课程的教学案例,培养学生动手实现并解读复杂风险测度工具的能力。; 阅读建议:建议读者结合文中提供的Matlab代码逐行调试与运行,深入理解频域分析中谱密度、广义方差分解及频域权重的核心算法逻辑,并尝试将其应用于自身的研究课题或实际数据。同时,强烈推荐阅读Baruník & Křehlík(2018)等原始文献,以夯实理论基础,全面把握方法的假设前提与适用边界。
标题SpringBoot与微信小程序结合的健康饮食平台研究AI更换标题第1章引言阐述健康饮食平台研究背景、意义、国内外现状、论文方法及创新点。1.1研究背景与意义分析健康饮食需求增长及平台开发的重要性。1.2国内外研究现状梳理国内外健康饮食平台及小程序开发研究进展。1.3研究方法以及创新点介绍采用SpringBoot与微信小程序结合的方法及创新。第2章相关理论总结健康饮食、SpringBoot及微信小程序开发相关理论。2.1健康饮食理论介绍健康饮食原则、营养搭配等基础知识。2.2SpringBoot框架概述SpringBoot框架特点、优势及应用场景。2.3微信小程序开发阐述微信小程序开发流程、技术要点及限制。第3章健康饮食平台需求分析对健康饮食平台进行功能、性能及用户需求分析。3.1功能需求列举平台应具备的健康饮食推荐、记录等功能。3.2性能需求分析平台响应时间、稳定性等性能要求。3.3用户需求调研同用户群体对健康饮食平台的需求差异。第4章健康饮食平台设计详细介绍健康饮食平台的架构、数据库及界面设计。4.1平台架构设计给出平台整体架构,包括前端、后端及数据库。4.2数据库设计设计平台所需数据库表结构,确保数据高效存储。4.3界面设计展示平台界面设计,注重用户体验与交互性。第5章健康饮食平台实现介绍健康饮食平台开发环境、关键技术及实现过程。5.1开发环境搭建列出开发所需软件、硬件环境及配置要求。5.2关键技术实现阐述SpringBoot与微信小程序结合的关键技术实现。5.3平台功能实现详细介绍平台各项功能的实现过程及代码示例。第6章研究结果展示健康饮食平台测试结果,包括功能测试、性能测试。6.1功能测试结果通过测试用例验证平台各项功能是否正常运行。6.2性能测试结果分析平台在同负载下的性能表现及优化建议。6.3用户反馈收集用户使用反馈,评估平台满意度及改进方向。第7章结
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值