如何在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
相关产品推荐
相关产品推荐

