假设我有这个数据集:
#### Load Library ####
library(tidyverse)
#### Create Data ####
df <- data.frame(city = c("rural","urban","rural","urban","rural"),
smog = c("high","low","high","low","high"),
x1 = c(1,2,3,4,5),
x2 = c(1,2,3,4,5),
y1 = c(1,2,3,4,5),
y2 = c(1,2,3,4,5))
看起来像这样:
city smog x1 x2 y1 y2
1 rural high 1 1 1 1
2 urban low 2 2 2 2
3 rural high 3 3 3 3
4 urban low 4 4 4 4
5 rural high 5 5 5 5
如果我使用一个变量,将这些数据转换为长格式并不困难。然而,我试图将x和y变量分别转换为一列,同时将城市和烟雾变量保留在相同的数据中。我目前正在查看的数据有许多变量需要转换为长格式,还有许多变量需要保持宽格式。我的最佳猜测是:
#### Pivot Data ####
df %>%
pivot_longer(cols = contains(c("x","y")),
names_to = c("x.items", "y.items"),
values_to = "value")
除此之外:
#### Pivot Data Version 2 ####
df %>%
pivot_longer(cols = contains(c("x","y")),
names_to = c("x.items", "y.items"),
values_to = c("value.x", "value.y"))
但这似乎在任何一种情况下都不起作用。任何建议都会很有帮助。
您应该将names_to
与.value
一起使用,并在names_pattern
中定义模式(这里,第一组是x
或y
,第二组是数字(。列的名称由位于与.value
(此处为第一个(相同位置的组的名称给定。
注意,contains(c("x", "y"))
包括"city"
,所以最好使用matches
或否定(我在这里所做的(。
df %>%
pivot_longer(cols = -c("city", "smog"),
names_to = c(".value", "n"),
names_pattern = "(x|y)(\d)")
输出
# A tibble: 10 × 5
city smog n x y
<chr> <chr> <chr> <dbl> <dbl>
1 rural high 1 1 1
2 rural high 2 1 1
3 urban low 1 2 2
4 urban low 2 2 2
5 rural high 1 3 3
6 rural high 2 3 3
7 urban low 1 4 4
8 urban low 2 4 4
9 rural high 1 5 5
10 rural high 2 5 5