假設我有這個資料框:
> 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)
但它給了我一個錯誤。
uj5u.com熱心網友回復:
一種選擇是從 columns 獲取最大值B,C并D使用pmax, useuncount來重復行。用于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
uj5u.com熱心網友回復:
顯然,這里只有一個值> 0在B列到d,所以我們可以利用的部分rowSums為replicate以d對B列的呼叫使用二值化> 0。為了我們可以在 中使用它Map,我們t進行了兩次轉換。休息是化妝品。
t(do.call(cbind, Map(replicate,
rowSums(df[-1]),
as.data.frame(t(cbind(df[1], df[-1] > 0)))))) |>
as.data.frame() |>
setNames(names(df))
# 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
注意:使用R>=4.1。
uj5u.com熱心網友回復:
只是為了稍微修改一下 Ronak Shah 的回答,我意識到你可以簡單地只用dplyr:
library(dplyr)
df[rep(rownames(df), apply(select(df, -A), 1, max)),] %>%
as.data.frame(row.names=1:nrow(.)) %>%
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
或與rowSums:
library(dplyr)
df[rep(rownames(df), rowSums(select(df, -A)),] %>%
as.data.frame(row.names=1:nrow(.)) %>%
mutate(across(-A, pmin, 1))
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/313017.html
下一篇:將行從年值到月值pandas
