将多个同名不同后缀的列转换成面板结构
Transform multiple columns of the same name and different suffixes into a panel structure
我需要在面板结构中放置多个同名但后缀不同的变量。例如,转换:
在这个结构中:
我尝试结合 tidyverse 包中的 pivot_longer 和 pivot_wider 函数,但我没有成功,因为变量分布在数字、整数、字符等之间
感谢任何帮助。
这是可重现的例子:
structure(list(class.x = c(4, 4, 4, 4, 4), class.y = c("a", "a",
"a", "a", "a"), class.x.x = structure(c(9.88131291682493e-324,
9.88131291682493e-324, 9.88131291682493e-324, 9.88131291682493e-324,
9.88131291682493e-324), class = "integer64"), var1.x = c(1, 1,
1, 1, 1), var1.y = c(0, 0, 0, 0, 0), var1.x.x = c("b", "b", "b",
"b", "b"), var2.x = c(9, 9, 9, 9, 9), var2.y = c(5, 5, 5, 5,
5), var2.x.x = c("c", "c", "c", "c", "c")), class = "data.frame", row.names = c(NA,
-5L))
df %>%
pivot_longer(everything(),
names_to = c('.value','Variable'),
names_pattern = '([^.]+)[.](.*)',
values_transform = as.character)
# A tibble: 15 x 4
Variable class var1 var2
<chr> <chr> <chr> <chr>
1 x 4 1 9
2 y a 0 5
3 x.x 0 b c
4 x 4 1 9
5 y a 0 5
6 x.x 0 b c
7 x 4 1 9
8 y a 0 5
9 x.x 0 b c
10 x 4 1 9
11 y a 0 5
12 x.x 0 b c
13 x 4 1 9
14 y a 0 5
15 x.x 0 b c
请注意提供的 dput
与您发布的图片不同:
首先我们可以创建全部由一个分隔的名称.
然后我们必须将所有转换为字符:我用 mutate(across...
做的 KU99 用 values_transform
做的更优雅!
现在我们可以用 names_sep
参数应用 pivot_longer
。
终于把数据整理好。
library(tidyverse)
df %>%
rename_with(~str_replace_all(., ".x.x", ".z")) %>%
mutate(across(everything(), as.character)) %>%
pivot_longer(
everything(),
names_to = c(".value", "var1_2"),
names_sep ="\."
) %>%
arrange(var1_2) %>%
mutate(Variable=ifelse(var1_2 == "z", "x.x", var1_2), .keep="unused")
class var1 var2 Variable
<chr> <chr> <chr> <chr>
1 4 1 9 x
2 4 1 9 x
3 4 1 9 x
4 4 1 9 x
5 4 1 9 x
6 a 0 5 y
7 a 0 5 y
8 a 0 5 y
9 a 0 5 y
10 a 0 5 y
11 9.88131291682493e-324 b c x.x
12 9.88131291682493e-324 b c x.x
13 9.88131291682493e-324 b c x.x
14 9.88131291682493e-324 b c x.x
15 9.88131291682493e-324 b c x.x
我需要在面板结构中放置多个同名但后缀不同的变量。例如,转换:
在这个结构中:
我尝试结合 tidyverse 包中的 pivot_longer 和 pivot_wider 函数,但我没有成功,因为变量分布在数字、整数、字符等之间
感谢任何帮助。
这是可重现的例子:
structure(list(class.x = c(4, 4, 4, 4, 4), class.y = c("a", "a",
"a", "a", "a"), class.x.x = structure(c(9.88131291682493e-324,
9.88131291682493e-324, 9.88131291682493e-324, 9.88131291682493e-324,
9.88131291682493e-324), class = "integer64"), var1.x = c(1, 1,
1, 1, 1), var1.y = c(0, 0, 0, 0, 0), var1.x.x = c("b", "b", "b",
"b", "b"), var2.x = c(9, 9, 9, 9, 9), var2.y = c(5, 5, 5, 5,
5), var2.x.x = c("c", "c", "c", "c", "c")), class = "data.frame", row.names = c(NA,
-5L))
df %>%
pivot_longer(everything(),
names_to = c('.value','Variable'),
names_pattern = '([^.]+)[.](.*)',
values_transform = as.character)
# A tibble: 15 x 4
Variable class var1 var2
<chr> <chr> <chr> <chr>
1 x 4 1 9
2 y a 0 5
3 x.x 0 b c
4 x 4 1 9
5 y a 0 5
6 x.x 0 b c
7 x 4 1 9
8 y a 0 5
9 x.x 0 b c
10 x 4 1 9
11 y a 0 5
12 x.x 0 b c
13 x 4 1 9
14 y a 0 5
15 x.x 0 b c
请注意提供的 dput
与您发布的图片不同:
首先我们可以创建全部由一个分隔的名称.
然后我们必须将所有转换为字符:我用 mutate(across...
做的 KU99 用 values_transform
做的更优雅!
现在我们可以用 names_sep
参数应用 pivot_longer
。
终于把数据整理好。
library(tidyverse)
df %>%
rename_with(~str_replace_all(., ".x.x", ".z")) %>%
mutate(across(everything(), as.character)) %>%
pivot_longer(
everything(),
names_to = c(".value", "var1_2"),
names_sep ="\."
) %>%
arrange(var1_2) %>%
mutate(Variable=ifelse(var1_2 == "z", "x.x", var1_2), .keep="unused")
class var1 var2 Variable
<chr> <chr> <chr> <chr>
1 4 1 9 x
2 4 1 9 x
3 4 1 9 x
4 4 1 9 x
5 4 1 9 x
6 a 0 5 y
7 a 0 5 y
8 a 0 5 y
9 a 0 5 y
10 a 0 5 y
11 9.88131291682493e-324 b c x.x
12 9.88131291682493e-324 b c x.x
13 9.88131291682493e-324 b c x.x
14 9.88131291682493e-324 b c x.x
15 9.88131291682493e-324 b c x.x