r - 如何按多列的值重复行并分回
问题描述
假设我有这个数据框:
> 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
如您所见,有 value2
和3
,我想按该长度重复它们并将值更改回 1。我该怎么做?
A
如您所见,我还想复制该列。
我试过了:
replace(df[rep(rownames(df), select(df, -A)),], 2, 1)
但这给了我一个错误。
解决方案
一种选择是从 columns 获取最大值B
,C
并D
使用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
推荐阅读
- mysql - 在 MYSQL 的 ALTER TABLE 语句中使用变量或函数
- javascript - 选中的复选框在owl carousal html中自动取消选择
- python - 如何基于多列合并两个不相等的数据框?
- video - FFMPEG 如何在特定时间、大小和位置的较长视频中插入短视频和音频
- azure-api-management - azure apim 用户邀请链接到期日期
- c# - 是否可以使用 RestSharp 设置自定义请求方法?
- c# - 具有关系模式的 C# 9 新“嵌套开关表达式”
- php - 更新 CF7 后错误通知数组到字符串的转换
- c++ - 为什么 gdb 向我抱怨没有可用的源(使用 g++ -ggdb3)
- r - Tidymodels 包:使用 ggplot() 可视化袋装树以显示最重要的预测变量