如何根据另一列合并列
How to combine columns based on another column
我有一个与此类似的数据框。每个 'id' 的值都与三个组相关联。现在有 15 行和 3 列。
id <- c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5)
group <- c('Group1','Group2', 'Group3','Group1','Group2', 'Group3','Group1','Group2', 'Group3','Group1','Group2', 'Group3','Group1','Group2', 'Group3')
value <- c(49, 76, 14, 97, 78, 51, 48, 44, 81, 74, 85, 11, 82, 63, 91)
df <- cbind(id,group,value)
这给出了以下数据框。
id group value
[1,] "1" "Group1" "49"
[2,] "1" "Group2" "76"
[3,] "1" "Group3" "14"
[4,] "2" "Group1" "97"
[5,] "2" "Group2" "78"
[6,] "2" "Group3" "51"
[7,] "3" "Group1" "48"
[8,] "3" "Group2" "44"
[9,] "3" "Group3" "81"
[10,] "4" "Group1" "74"
[11,] "4" "Group2" "85"
[12,] "4" "Group3" "11"
[13,] "5" "Group1" "82"
[14,] "5" "Group2" "63"
[15,] "5" "Group3" "91"
我想重塑数据集,使其具有 5 行和 4 列。每个唯一 'id' 一行,每个组的值一列。期望的结果如下所示:
id Group1_value Group2_value Group3_value
[1,] 1 49 76 14
[2,] 2 97 78 51
[3,] 3 48 44 81
[4,] 4 74 85 11
[5,] 5 82 63 91
提前致谢!
如果你不介意使用 tidyverse 的一些包,你可以这样做:
library(dplyr)
library(tidyr)
df = as_tibble(df) # you can also use as.data.frame(), this is necessary bcs matrix do not work with pivot_wider
df %>% mutate(group = paste0(group, "_value")) %>% pivot_wider(names_from = group, values_from = value) # the mutate part is necessary only if you really want "_value" in the final column names
这是输出:
> df %>% mutate(group = paste0(group, "_value")) %>% pivot_wider(names_from = group, values_from = value)
# A tibble: 5 x 4
id Group1_value Group2_value Group3_value
<chr> <chr> <chr> <chr>
1 1 49 76 14
2 2 97 78 51
3 3 48 44 81
4 4 74 85 11
5 5 82 63 91
这是一个基本的 R 解决方案:
reshape(as.data.frame(df), v.names = "value", idvar = "id",
timevar = "group", direction = "wide")
#> id value.Group1 value.Group2 value.Group3
#> 1 1 49 76 14
#> 4 2 97 78 51
#> 7 3 48 44 81
#> 10 4 74 85 11
#> 13 5 82 63 91
我有一个与此类似的数据框。每个 'id' 的值都与三个组相关联。现在有 15 行和 3 列。
id <- c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5)
group <- c('Group1','Group2', 'Group3','Group1','Group2', 'Group3','Group1','Group2', 'Group3','Group1','Group2', 'Group3','Group1','Group2', 'Group3')
value <- c(49, 76, 14, 97, 78, 51, 48, 44, 81, 74, 85, 11, 82, 63, 91)
df <- cbind(id,group,value)
这给出了以下数据框。
id group value
[1,] "1" "Group1" "49"
[2,] "1" "Group2" "76"
[3,] "1" "Group3" "14"
[4,] "2" "Group1" "97"
[5,] "2" "Group2" "78"
[6,] "2" "Group3" "51"
[7,] "3" "Group1" "48"
[8,] "3" "Group2" "44"
[9,] "3" "Group3" "81"
[10,] "4" "Group1" "74"
[11,] "4" "Group2" "85"
[12,] "4" "Group3" "11"
[13,] "5" "Group1" "82"
[14,] "5" "Group2" "63"
[15,] "5" "Group3" "91"
我想重塑数据集,使其具有 5 行和 4 列。每个唯一 'id' 一行,每个组的值一列。期望的结果如下所示:
id Group1_value Group2_value Group3_value
[1,] 1 49 76 14
[2,] 2 97 78 51
[3,] 3 48 44 81
[4,] 4 74 85 11
[5,] 5 82 63 91
提前致谢!
如果你不介意使用 tidyverse 的一些包,你可以这样做:
library(dplyr)
library(tidyr)
df = as_tibble(df) # you can also use as.data.frame(), this is necessary bcs matrix do not work with pivot_wider
df %>% mutate(group = paste0(group, "_value")) %>% pivot_wider(names_from = group, values_from = value) # the mutate part is necessary only if you really want "_value" in the final column names
这是输出:
> df %>% mutate(group = paste0(group, "_value")) %>% pivot_wider(names_from = group, values_from = value)
# A tibble: 5 x 4
id Group1_value Group2_value Group3_value
<chr> <chr> <chr> <chr>
1 1 49 76 14
2 2 97 78 51
3 3 48 44 81
4 4 74 85 11
5 5 82 63 91
这是一个基本的 R 解决方案:
reshape(as.data.frame(df), v.names = "value", idvar = "id",
timevar = "group", direction = "wide")
#> id value.Group1 value.Group2 value.Group3
#> 1 1 49 76 14
#> 4 2 97 78 51
#> 7 3 48 44 81
#> 10 4 74 85 11
#> 13 5 82 63 91