按组逐行将转置列转变为新列

Mutate a transposed column into new columns row-wise by group

我将数据分组如下:

  group id var
1     1  1   1
2     1  2   0
3     1  3   1
4     2  1   0
5     2  2   1
6     3  1   0

我想创建 N 个新的 var 列(var1var2、...),其中 N 是一个组中的最大个体数(在此案例 N = 3,因为最大的组是 group 1,它有三个 ids.

var1 应包含每个组中 id = 1var 值;同样,var2 应该包含每个组中每个 id = 2var 值。如果列数超过组中的列数,则应 return NA.

上述示例的寻求输出为:

  group id var var1 var2 var3
1     1  1   1    1    0    1
2     1  2   0    1    0    1
3     1  3   1    1    0    1
4     2  1   0    0    1   NA
5     2  2   1    0    1   NA
6     3  1   0    0   NA   NA

示例代码

a <- data.frame(group = c(1,1,1,2,2,3), 
                id = c(1,2,3,1,2,1), 
                var = c(1,0,1,0,1,0))

您似乎想将数据框旋转得更宽:您可以使用 pivot_wider()。如果要保留原来的行数,也可以使用right_join().

library(tidyverse)
a %>% right_join(
  pivot_wider(a,values_from = var, names_from = id, names_prefix = "var"),
  by='group'
)

输出:

  group id var var1 var2 var3
1     1  1   1    1    0    1
2     1  2   0    1    0    1
3     1  3   1    1    0    1
4     2  1   0    0    1   NA
5     2  2   1    0    1   NA
6     3  1   0    0   NA   NA

但是,也许这有点多余?仅使用 pivot_wider() 保持相同的信息,因为 varx 是原始的 id 列:

library(tidyverse)
a %>% 
  pivot_wider(values_from = var, names_from = id, names_prefix = "var")

# A tibble: 3 x 4
  group  var1  var2  var3
  <dbl> <dbl> <dbl> <dbl>
1     1     1     0     1
2     2     0     1    NA
3     3     0    NA    NA