如何在R的tibble(tidyverse)中从单个因子列生成多个布尔列
解决方案
你可以通过以下两种方式用pivot_wider实现需求,核心是明确分组列、设置布尔值填充规则:
方法一:先创建标记列
先添加一个标记存在的布尔列,再通过宽表转换生成目标列:
library(tidyverse) data <- tibble( x = c(1, 1, 1, 2, 2), y = c("a", "b", "c", "b", "c"), z = c("info1", "info1", "info1", "info2", "info2") ) |> mutate_at(vars(y), factor) dataf <- data |> mutate(exists = TRUE) |> # 标记当前y值对应ID存在 pivot_wider( id_cols = c(x, z), # 指定需要保留的分组列x和信息列z names_from = y, # 从y列提取新列的名称 values_from = exists, # 用标记列填充新列值 values_fill = FALSE # 不存在的y值对应位置填充FALSE )
方法二:直接用values_fn参数
省略临时标记列,通过values_fn直接生成布尔值:
dataf <- data |> pivot_wider( id_cols = c(x, z), names_from = y, values_fn = ~ TRUE, # 只要ID对应存在该y值就返回TRUE values_fill = FALSE # 缺失值填充FALSE )
两种方法运行后都会得到你需要的目标结果:
# A tibble: 2 × 5 x z a b c <dbl> <chr> <lgl> <lgl> <lgl> 1 1 info1 TRUE TRUE TRUE 2 2 info2 FALSE TRUE TRUE
你之前用pivot_wider失败,大概率是没指定id_cols保留z列,或是没设置values_fill和values_fn来控制布尔值的生成规则。
内容的提问来源于stack exchange,提问作者Bryce Smith
相关产品推荐
相关产品推荐

