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

如何在R语言中移除数据框中含多余0的行与列?

解决方案

方法一:使用dplyr包

通过分组提取每个Block下各列的非0值:

library(dplyr)

# 定义原始数据框
df <- data.frame(Block = c('1' , '1' , '1' , '2' , '2' , '2' , '3' , '3' , '3') ,
                 A  = c('1' , '0' , '0', '4' , '0', '0' , '1' , '0' , '0') ,
                 B  = c('0' , '1' , '0' , '0' , '4' , '0', '0', '6' , '0') ,
                 C = c('0' , '0' , '1' , '0' , '0' , '4' , '0' , '0' , '5'))

# 处理数据
df1 <- df %>%
  group_by(Block) %>%
  summarize(
    A = A[A != '0'],
    B = B[B != '0'],
    C = C[C != '0']
  ) %>%
  ungroup()

# 输出结果
df1

逻辑说明:按Block分组后,每个分组内的A/B/C列各仅有一个非0值,直接提取该值即可完成合并。

方法二:Base R原生实现

无需额外安装包,用原生函数完成处理:

# 定义原始数据框
df <- data.frame(Block = c('1' , '1' , '1' , '2' , '2' , '2' , '3' , '3' , '3') ,
                 A  = c('1' , '0' , '0', '4' , '0', '0' , '1' , '0' , '0') ,
                 B  = c('0' , '1' , '0' , '0' , '4' , '0', '0', '6' , '0') ,
                 C = c('0' , '0' , '1' , '0' , '0' , '4' , '0' , '0' , '5'))

# 拆分数据并提取非0值
df1 <- do.call(rbind, lapply(split(df, df$Block), function(x) {
  data.frame(
    Block = unique(x$Block),
    A = x$A[x$A != '0'],
    B = x$B[x$B != '0'],
    C = x$C[x$C != '0']
  )
}))

# 重置行名
rownames(df1) <- NULL

# 输出结果
df1

逻辑说明:用split按Block拆分数据框,对每个子框提取各列非0值后重组为新数据框,最后合并所有子框并重置行名。

可选:转换为数值型

如果需要将A/B/C列转为数值类型,可在处理后添加以下代码:

  • dplyr方法:
df1 <- df1 %>% mutate(across(A:C, as.numeric))
  • Base R方法:
df1[, c('A','B','C')] <- lapply(df1[, c('A','B','C')], as.numeric)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 01:06:30