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

在R语言中从单个现有列生成指定新列的方法求助

解决长格式类别数据转宽格式并统计频数的问题

看起来你需要把n×1的tibble(仅含类别id列)转换成有序的n×6宽格式结构,方便统计每个类别(1、2、3、4、5、8、9)的出现次数。这里用R的tidyverse工具包就能轻松解决,给你两种方案:

方案1:直接生成频数统计结果

如果你不需要中间的n×6结构,只想直接得到每个类别的出现次数,可以一步到位:

library(dplyr)
library(tidyr)

# 假设你的原始数据框名为df
df %>%
  count(id) %>%  # 先统计每个id的出现次数
  pivot_wider(
    names_from = id,
    values_from = n,
    values_fill = 0,
    names_repair = ~ c(1,2,3,4,5,8,9)  # 指定列的顺序
  )

运行后会得到一个1×6的表格,每列对应一个类别,值就是该类别的总出现次数。

方案2:生成你需要的n×6 one-hot编码结构

如果你确实需要先转换成每行对应原始数据一行的n×6结构(对应类别列标记为1,其余为0),可以这样做:

library(dplyr)
library(tidyr)

df_wide <- df %>%
  mutate(
    row_num = row_number(),  # 添加行号辅助列,确保每行对应原始数据的一行
    flag = 1  # 标记当前行的类别
  ) %>%
  pivot_wider(
    names_from = id,
    values_from = flag,
    values_fill = 0,
    names_repair = ~ c("row_num", 1,2,3,4,5,8,9)  # 强制指定列的顺序
  ) %>%
  select(-row_num)  # 移除辅助列

转换后的df_wide就是你想要的结构,比如原始前4行数据:

# A tibble: 4 x 1
     id
  <int>
1     2
2     3
3     3
4     1

会变成:

# A tibble: 4 x 6
    `1`   `2`   `3`   `4`   `5`   `8`   `9`
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1     0     1     0     0     0     0     0
2     0     0     1     0     0     0     0
3     0     0     1     0     0     0     0
4     1     0     0     0     0     0     0

之后要统计每个类别的次数,只需运行colSums(df_wide)即可得到各列的总和。

为什么transpose不好用?

你提到用transpose遇到了排序问题,这是因为transpose只是简单互换行列,无法识别你需要的固定类别顺序,也不能自动填充缺失的类别为0。而pivot_wider可以精准控制列的顺序,还能自动补0,完美匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:31:10