R语言中如何拆分含多个非零值的数据行,每行仅保留一个非零值?
解决方法:将每行非零值拆分为独立行
先修正原始数据的类型问题(cbind生成的是字符矩阵,需转为数据框并将数值列转成数值型),再用tidyverse工具链实现需求:
library(tidyverse) # 处理原始数据格式 df1 <- as.data.frame(cbind(c("a","b"),c("c","c"),c(0,8),c(4,0),c(5,0),c(0,12))) colnames(df1) <- c("name1","name2","v1","v2","v3","v4") df1 <- df1 %>% mutate(across(v1:v4, as.numeric)) # 核心处理逻辑 df_result <- df1 %>% # 将v1-v4列转为长格式,保留name组合列 pivot_longer(cols = v1:v4, names_to = "var", values_to = "val") %>% # 过滤掉值为0的行 filter(val != 0) %>% # 转回宽格式,空缺位置填充0 pivot_wider(names_from = var, values_from = val, values_fill = 0) %>% # 恢复原始列顺序 select(name1, name2, v1, v2, v3, v4) print(df_result)
运行后输出结果:
# A tibble: 4 × 6 name1 name2 v1 v2 v3 v4 <chr> <chr> <dbl> <dbl> <dbl> <dbl> 1 a c 0 4 0 0 2 a c 0 0 5 0 3 b c 8 0 0 0 4 b c 0 0 0 12
逻辑说明
pivot_longer把所有数值列展开为「变量名-值」的长格式,让每个非零值都能单独成为一条记录;filter筛掉0值行,只保留需要拆分的有效数据;pivot_wider转回宽格式时,用values_fill=0自动填充当前行未涉及的变量值,刚好实现「单个非零值占一行,其余列补0」的需求。
内容的提问来源于stack exchange,提问作者Hard_Course
相关产品推荐
相关产品推荐

