将一列分成多个变量并使 df 变长
Separate a column into multiple variables and making the df long
我对在 R 中重塑我的数据框感到有点困惑。假设我有一个这样的数据框:
SVI SDI CVI CDE
12 10 5 3
11 9 4 2
所以每一列代表一组子变量,我现在想像这样保持不同:
Value First_letter Second_letter Third_letter
12 S V I
11 S V I
10 S D I
9 S D I
5 C V I
4 C V I
3 C D E
2 C D E
有没有办法避免手动执行此操作?我正在考虑使用 Reshape2,但我真的想不出解决问题的方法。谢谢!
这是一个使用 tidyr
(tidyverse 的一部分)的解决方案。
library(tidyr)
# your initial dataset
df = data.frame(SVI = c(12,11),
SDI = c(10,9),
CVI = c(5,4),
CDE = c(3,2))
# The output you want
df_pivot = df %>%
pivot_longer(1:length(.)) %>%
separate(name, into = c("First_letter", "Second_letter", "Third_letter"), sep = c(1,2,3)) # see ?separate for more informations
输出:
df_pivot
# A tibble: 8 x 4
First_letter Second_letter Third_letter value
<chr> <chr> <chr> <dbl>
1 S V I 12
2 S D I 10
3 C V I 5
4 C D E 3
5 S V I 11
6 S D I 9
7 C V I 4
8 C D E 2
我对在 R 中重塑我的数据框感到有点困惑。假设我有一个这样的数据框:
SVI SDI CVI CDE
12 10 5 3
11 9 4 2
所以每一列代表一组子变量,我现在想像这样保持不同:
Value First_letter Second_letter Third_letter
12 S V I
11 S V I
10 S D I
9 S D I
5 C V I
4 C V I
3 C D E
2 C D E
有没有办法避免手动执行此操作?我正在考虑使用 Reshape2,但我真的想不出解决问题的方法。谢谢!
这是一个使用 tidyr
(tidyverse 的一部分)的解决方案。
library(tidyr)
# your initial dataset
df = data.frame(SVI = c(12,11),
SDI = c(10,9),
CVI = c(5,4),
CDE = c(3,2))
# The output you want
df_pivot = df %>%
pivot_longer(1:length(.)) %>%
separate(name, into = c("First_letter", "Second_letter", "Third_letter"), sep = c(1,2,3)) # see ?separate for more informations
输出:
df_pivot
# A tibble: 8 x 4
First_letter Second_letter Third_letter value
<chr> <chr> <chr> <dbl>
1 S V I 12
2 S D I 10
3 C V I 5
4 C D E 3
5 S V I 11
6 S D I 9
7 C V I 4
8 C D E 2