如何转换我的数据框以使行成为列?

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

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

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的所有值合并到一列中并与gsub()csplit()分开,但是在将每种类型的所有Stat值合并到一列中时遇到了问题。有什么建议吗?

r dataframe rows transpose csplit
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

或使用dcast中的data.table

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

或者如base R中建议的@Onyambu,可以用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))
© www.soinside.com 2019 - 2024. All rights reserved.