我有一个数据集,其中有一组值可以是1或0的列.我想创建一组新的列(path_1:path_n),以指示具有1的列标题.

以下是我的数据帧片段:

df <- data.frame(ID = c(1, 2, 3),
                 `1_0_1_0` = c(1, 0, 0), `1_0_0_0` = c(0, 0, 1),
                 `2_0_1_0` = c(1, 1, 0), `2_0_3_0` = c(0, 0, 0),
                 check.names = FALSE)

我的预期yields 应该是这样的.

enter image description here

推荐答案

(1) base solution

ind <- 2:5
path.seq <- seq_len(max(rowSums(df[ind])))
mat <- apply(df[ind] > 0, 1, \(x) names(which(x))[path.seq])
row.names(mat) <- paste0("path", path.seq)
cbind(df, t(mat))

#   ID 1_0_1_0 1_0_0_0 2_0_1_0 2_0_3_0   path1   path2
# 1  1       1       0       1       0 1_0_1_0 2_0_1_0
# 2  2       0       0       1       0 2_0_1_0    <NA>
# 3  3       0       1       0       0 1_0_0_0    <NA>

Update:将第mat行替换如下,以处理列可以采用任何非负整数的情况.

mat <- apply(df[ind], 1, \(x) rep(names(df)[ind], x)[path.seq])

(2) tidyverse solution

Option 1
library(tidyverse)

df %>%
  pivot_longer(-ID) %>%
  filter(value > 0) %>%
  # uncount(value) %>%
  mutate(path = paste0("path", row_number()), .by = ID) %>%
  pivot_wider(id_cols = ID, names_from = path, values_from = name) %>%
  left_join(df, ., by = "ID")

Update:filter()mutate()之间插入uncount(value),以处理列可以采用任何非负整数的情况.

Option 2
df %>%
  mutate(
    across(-ID, ~ if_else(.x > 0, cur_column(), NA)) %>%
      unite("path", sep = ';', na.rm = TRUE)
  ) %>%
  separate_wider_delim(path, delim = ';', names_sep = '', too_few = "align_start")

# # A tibble: 3 × 7
#      ID `1_0_1_0` `1_0_0_0` `2_0_1_0` `2_0_3_0` path1   path2  
#   <dbl>     <dbl>     <dbl>     <dbl>     <dbl> <chr>   <chr>  
# 1     1         1         0         1         0 1_0_1_0 2_0_1_0
# 2     2         0         0         1         0 2_0_1_0 NA     
# 3     3         0         1         0         0 1_0_0_0 NA

R相关问答推荐

当y大于阈值和值范围时,在时间序列中突出显示区域

在水平条形图中zoom x_轴

DT::可数据的正规表达OR运算符问题

查找满足SpatRaster中条件的单元格位置

删除facet_wrap标签之间的水平线

使用对管道内单元格的引用生成新变量

计算R中的威布尔分布的EDF

更改绘图上的x轴断点,而不影响风险?

MCMC和零事件二元逻辑回归

r—绘制相交曲线

如何从当前行上方找到符合特定条件的最接近值?

我不能在docker中加载sf

在另一个函数中调用ggplot2美学

我如何才能找到FAMILY=POISSON(LINK=&Q;LOG&Q;)中的模型预测指定值的日期?

将多列合并为单独的名称—值对

将重复项转换为NA

合并后返回列表的数据帧列表

如何在ggplot2中创建多个y轴(每个变量一个)

将多个列合并为一个列的有效方法是什么?

将数据从一列转换为按组累计计数的单个虚拟变量