我有一个包含两列的数据框,分别是“类型”和“状态”。我希望每种类型在单独的一列中包含所有统计信息的一行。例如,我的数据框看起来像这样:
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值合并到一列中时遇到了问题。有什么建议吗?
创建按“类型”分组的序列列后,我们可以使用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))