如何在 R 中正确格式化我的面板数据?
How to properly format my panel data in R?
我知道存在类似的问题,但我已经尝试了从熔化到重塑到堆叠等所有方法,但没有什么能让我更接近。
我的数据目前是这样的:
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
有什么建议吗?
我们可能会使用pivot_longer
——主要要考虑的是names_to
和names_pattern
。在这里,我们需要 'Round' 列,该列应生成值作为列名中 'Round' 的后缀,另一列作为列的值 (.value
)。在 names_pattern
中,将列名称子字符串捕获为具有捕获组 ((...)
) 的组,即 -\w+
- 应匹配 'Round',后跟 _
,然后捕获数字 ((\d+)
),然后是下划线 (_
),然后是下一个捕获组 ((.*
)),其中包含 [=16] 的其余字符=]部分
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))
这是一种不使用 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
我知道存在类似的问题,但我已经尝试了从熔化到重塑到堆叠等所有方法,但没有什么能让我更接近。
我的数据目前是这样的:
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
有什么建议吗?
我们可能会使用pivot_longer
——主要要考虑的是names_to
和names_pattern
。在这里,我们需要 'Round' 列,该列应生成值作为列名中 'Round' 的后缀,另一列作为列的值 (.value
)。在 names_pattern
中,将列名称子字符串捕获为具有捕获组 ((...)
) 的组,即 -\w+
- 应匹配 'Round',后跟 _
,然后捕获数字 ((\d+)
),然后是下划线 (_
),然后是下一个捕获组 ((.*
)),其中包含 [=16] 的其余字符=]部分
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))
这是一种不使用 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