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

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

逻辑说明

  1. pivot_longer把所有数值列展开为「变量名-值」的长格式,让每个非零值都能单独成为一条记录;
  2. filter筛掉0值行,只保留需要拆分的有效数据;
  3. pivot_wider转回宽格式时,用values_fill=0自动填充当前行未涉及的变量值,刚好实现「单个非零值占一行,其余列补0」的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 23:07:25