【问题标题】:How to transform my data frame to make rows columns?如何转换我的数据框以制作行列?
【发布时间】:2020-05-28 06:51:22
【问题描述】:

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

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】:

我们可以在创建一个按“类型”分组的序列列后使用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

或者使用来自data.tabledcast

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))

【讨论】:

  • 你也可以从基础 R 中添加 reshape(transform(df1,time = ave(Stats,Type,FUN = seq_along)),dir="wide",idvar = "Type",sep = "_")
猜你喜欢
  • 2018-08-10
  • 1970-01-01
  • 2014-04-28
  • 2018-07-12
  • 2021-11-15
  • 2022-01-19
  • 2018-02-21
  • 2019-09-27
  • 2021-03-30
相关资源
最近更新 更多