I know that similar questions exist but I have tried everything from melt to reshape to Stacked, etc. and nothing is getting me even close.
My data currently looks like this:
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
I need it to instead look like this:
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
Any suggestions?
CodePudding user response:
We may use pivot_longer - main things to consider is the names_to and names_pattern. Here, we need 'Round' column that should generate the values as the suffix of 'Round' in column name and the other column as the value of the column (.value). In the names_pattern, capture the column names substring as a group with capture group ((...)) i.e. -\\w - should match the 'Round', followed by the _, then capture the digits((\\d )), then the underscore (_) followed by the next capture group ((.*)) that includes the rest of the characters for the .value part
library(tidyr)
pivot_longer(df1, cols = starts_with("Round"),
names_to = c("Round", ".value"), names_pattern = "\\w _(\\d )_(.*)")
-output
# 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
data
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))
CodePudding user response:
Here is an alternative approach without using names_pattern argument
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
