使用id变量重复的按组重整data.frame

问题描述 投票:0回答:1

我想重塑/重新排列一个数据集,该数据集存储为具有两列的data.frame:

  • id(非唯一,即可以重复几行)->存储为字符
  • 值->存储为数值(范围1:3)

样本数据:

id <- as.character(1001:1003)
val_list <- data.frame(sample(1:3, size=12, replace=TRUE))
have <- data.frame(cbind(rep(id, 4), val_list))
colnames(have) <- c("id", "values")
have <- have %>% arrange(id)

这给了我以下输出:

   id   values
1  1001      2
2  1001      2
3  1001      2
4  1001      3
5  1002      2
6  1002      3
7  1002      2
8  1002      2
9  1003      1
10 1003      3
11 1003      1
12 1003      2

我想要的是:

want <- data.frame(cbind(have[1:4, 2], 
                     have[5:8, 2],
                     have[9:12, 2]))
colnames(want) <- id

需求的输出:

    1001 1002 1003
  1    2    2    1
  2    2    3    3
  3    2    2    1
  4    3    2    2

我的原始数据集具有> 1000个变量“ id”和> 50个变量“值”。我想对数据集进行分块/切片,以获得新的data.frame,其中每个“ id”变量将代表一列,列出其“ value”变量内容。

可以通过循环来解决,但是我想拥有矢量化解决方案。如果可能的话,将基R用作“单线”,但也应赞赏其他解决方案。

r group-by reshape transpose data-wrangling
1个回答
0
投票

您可以使用:

have %>%
  group_by(id) %>%
  mutate(row = row_number()) %>%
  tidyr::pivot_wider(names_from = id, values_from = values) %>%
  select(-row)

或使用data.table

library(data.table)
dcast(setDT(have), rowid(id)~id, value.var = 'values')
© www.soinside.com 2019 - 2024. All rights reserved.