0

我有一个包含两列“类型”和“统计”的数据框。我希望每种类型都有一行,所有统计信息都在单独的列中。例如,我的数据框看起来像这样:

Column Type has values: A A A A B B B B
Column Stats has values:15 2 73 12 12 6 52 17  

我希望它看起来像:

Column Type has values: A B
Column Stat1 has values: 15 12
Column Stat2 has values: 2 6
Column Stat3 has values: 73 52
Column Stat4 has values: 12 17

并非所有类型都具有相同数量的统计信息,某些类型缺少统计值,而其他类型则有额外的。我尝试使用 t(),但遇到了问题。然后,我尝试将 Stat 的所有值合并到一列并用 and 分隔gsub()csplit()但是我遇到了将每种类型的所有 Stat 值合并到一列的问题。有什么建议吗?

4

1 回答 1

1

我们可以pivot_wider在创建按“类型”分组的序列列之后使用

library(dplyr)
library(tidyr)
df1 %>%
   group_by(Type) %>%
   mutate(rn = str_c('Stats_', row_number())) %>%
   ungroup %>%
   pivot_wider(names_from = rn, values_from = Stats)
# A tibble: 2 x 5
#  Type  Stats_1 Stats_2 Stats_3 Stats_4
#  <fct>   <dbl>   <dbl>   <dbl>   <dbl>
#1 A          15       2      73      12
#2 B          12       6      52      17

或使用dcastfromdata.table

library(data.table)
dcast(setDT(df1), Type ~ paste0("Stats_", rowid(Type)),  value.var = 'Stats')

或者正如@Onyambu 建议的那样base R,它可以用reshape

reshape(transform(df1, time = ave(Stats, Type,
           FUN = seq_along)), dir="wide", idvar = "Type", sep = "_")

数据

df1 <- data.frame(Type = rep(c("A", "B"), each = 4), 
         Stats = c(15, 2, 73, 12, 12, 6, 52, 17))
于 2020-02-12T16:31:53.533 回答