首页 > 解决方案 > 如何按多列的值重复行并分回

问题描述

假设我有这个数据框:

> df <- data.frame(A=1:5, B=c(0, 0, 3, 0, 0), C=c(1, 0, 0, 1, 0), D=c(0, 2, 0, 0, 1))
> df
  A B C D
1 1 0 1 0
2 2 0 0 2
3 3 3 0 0
4 4 0 1 0
5 5 0 0 1

我将如何将其转换为:

  A B C D
1 1 0 1 0
2 2 0 0 1
3 2 0 0 1
4 3 1 0 0
5 3 1 0 0
6 3 1 0 0
7 4 0 1 0
8 5 0 0 1

如您所见,有 value23,我想按该长度重复它们并将值更改回 1。我该怎么做?

A如您所见,我还想复制该列。

我试过了:

replace(df[rep(rownames(df), select(df, -A)),], 2, 1)

但这给了我一个错误。

标签: rdataframerepeat

解决方案


一种选择是从 columns 获取最大值BCD使用pmax,uncount重复行。用于pmin将大于 1 的值替换为 1。

library(dplyr)
library(tidyr)

df %>%
  mutate(repeat_row = pmax(B, C, D)) %>%
  uncount(repeat_row) %>%
  mutate(across(-A, pmin, 1))

#  A B C D
#1 1 0 1 0
#2 2 0 0 1
#3 2 0 0 1
#4 3 1 0 0
#5 3 1 0 0
#6 3 1 0 0
#7 4 0 1 0
#8 5 0 0 1

推荐阅读