You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用apply对数据框逐行应用函数时R返回维度错误的求助

问题分析与解决

错误原因

你用apply(Output, 1, ScanHits)时,apply会把数据框的每一行转换成一维向量传给ScanHits函数,而非保持单行数据框的结构:

  • 单独处理Output[1,]时,得到的是单行数据框,所以select_if和colSums能正常工作
  • 但apply传入的x是向量,x[,]这种二维索引写法本身不合法(向量只有一维),且select_if是针对数据框的函数,无法直接作用于向量,因此报错。

正确实现方式

你的需求是逐行保留非0值单元格,以下两种方法可以实现:

方法1:修改apply的处理函数

直接对传入的向量筛选非0元素即可:

# 定义处理函数:筛选向量中的非0值
ScanHits <- function(x) {
  x[x != 0]
}

# 逐行应用,得到列表(每个元素对应一行的非0值,带列名)
result <- apply(Output, 1, ScanHits)

返回的result是一个列表,每个元素的名称对应原数据框的行名,元素内容是该行的非0值(保留列名)。

方法2:用dplyr的行处理语法

如果你习惯tidyverse风格,可以用rowwise结合across实现:

library(dplyr)

result <- Output %>%
  rowwise() %>%
  # 把每行的非0值存成列表列
  mutate(non_zero = list(across(everything(), ~ .[. != 0]))) %>%
  # 提取列表列作为最终结果
  pull(non_zero)

# 给列表添加行名
names(result) <- rownames(Output)

补充说明

因为每行的非0值数量可能不同,无法直接拼成规整的数据框,所以用列表存储是最合理的方式。如果后续需要转换格式,可以再根据需求处理。

内容的提问来源于stack exchange,提问作者BHeatP234

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 17:50:28