我知道存在類似的問題,但我已經嘗試了從熔化到重塑到堆疊等所有方法,但沒有什么能讓我更接近。
我的資料目前看起來像這樣:
ID Treatment Round_1_Decision1 Round_1_Decision2 Round_2_Decision1 Round_2_Decision2
1 2 1 0 0 1
2 1 0 0 1 1
我需要它看起來像這樣:
ID Treatment Round Decision1 Decision2
1 2 1 1 0
1 2 2 0 1
2 1 1 0 0
2 1 2 1 1
有什么建議?
uj5u.com熱心網友回復:
我們可能會使用pivot_longer- 主要考慮的是names_to和names_pattern。在這里,我們需要 'Round' 列,它應該生成作為列名中 'Round' 后綴的值,以及作為列 ( .value)值的另一列。在 中names_pattern,將列名子字串捕獲為一個組,使用捕獲組 ( (...)) ie --\\w 應匹配“Round”,然后是_,然后捕獲數字 ( (\\d )),然后是下劃線 ( _) ,然后是下一個捕獲組 ( (.*) ) 包括.value零件的其余字符
library(tidyr)
pivot_longer(df1, cols = starts_with("Round"),
names_to = c("Round", ".value"), names_pattern = "\\w _(\\d )_(.*)")
-輸出
# A tibble: 4 × 5
ID Treatment Round Decision1 Decision2
<int> <int> <chr> <int> <int>
1 1 2 1 1 0
2 1 2 2 0 1
3 2 1 1 0 0
4 2 1 2 1 1
資料
df1 <- structure(list(ID = 1:2, Treatment = 2:1, Round_1_Decision1 = 1:0,
Round_1_Decision2 = c(0L, 0L),
Round_2_Decision1 = 0:1, Round_2_Decision2 = c(1L,
1L)), class = "data.frame", row.names = c(NA, -2L))
uj5u.com熱心網友回復:
這是一種不使用names_pattern引數的替代方法
library(tidyverse)
df %>%
pivot_longer(
cols=-c(ID, Treatment),
names_to = "Round",
values_to = "value"
) %>%
mutate(Decision = str_sub(Round, -9, -1),
Round = parse_number(Round)
) %>%
pivot_wider(
names_from = Decision,
values_from = value
)
ID Treatment Round Decision1 Decision2
<int> <int> <dbl> <int> <int>
1 1 2 1 1 0
2 1 2 2 0 1
3 2 1 1 0 0
4 2 1 2 1 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/351297.html
