如何根据另一列合并列

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