[英]Transpose data frame in r - optimizing the code
我在 R 中获得了以下数据框,并找到了一种转置它的方法,但我想优化代码。
所以我的数据框是这样的:
EVENT NUMBER HOURS_PCT CYCLES_PCT
A23 -17 2 2
A23 -18 3 3
A23 -19 4 4
A23 -20 5 5
A23 -21 6 6
A23 -22 7 7
A23 -23 8 8
A23 -24 9 9
A23 -25 10 10
CD12 -1 11 11
CD12 -2 12 12
CD12 -3 13 13
CD12 -4 14 14
CD12 -5 15 15
CD12 -6 16 16
CD12 -7 17 17
结果很好且正确,如下所示:
EVENT <- c('A23','A23','A23','A23','A23','A23','A23','A23','A23','CD12','CD12','CD12','CD12','CD12','CD12','CD12')
NUMBER <-c('-17','-18','-19','-20','-21','-22','-23','-24','-25','-1','-2','-3','-4','-5','-6','-7')
HOURS_PCT <- seq(from=2, to=17, by=1)
CYCLES_PCT <- seq(from=2, to=17, by=1)
df <- data.frame(EVENT, NUMBER, HOURS_PCT, CYCLES_PCT)
df_1h <- df %>%
arrange(EVENT, NUMBER, HOURS_PCT) %>%
group_by(EVENT) %>% top_n(5,NUMBER) %>%
mutate(SEQ = row_number())
df_1c <- df %>%
arrange(EVENT, NUMBER, CYCLES_PCT) %>%
group_by(EVENT) %>% top_n(5,NUMBER) %>%
mutate(SEQ = row_number())
df_1h$NUMBER<-NULL; df_1h$CYCLES_PCT<-NULL
df_1c$NUMBER<-NULL; df_1c$HOURS_PCT<-NULL
df_1h_t <- spread(df_1h, SEQ, HOURS_PCT, fill = "")
df_1c_t <- spread(df_1c, SEQ, CYCLES_PCT, fill = "")
df_final <- cbind(df_1h_t,df_1c_t)
df_final$EVENT1<-NULL
我发现它非常手动,想知道它是否可以优化。 我尝试将收集和传播添加到我的管道命令中,但它们从未奏效。
我认为可以通过首先转换以"PCT"
结尾的长格式列,在每个EVENT
和列中选择前 5 个NUMBER
,创建唯一标识符行并以宽格式获取数据来实现您想要的。
library(dplyr)
library(tidyr)
df %>%
pivot_longer(cols = ends_with('PCT')) %>%
group_by(EVENT, name) %>%
top_n(5, NUMBER) %>%
group_by(EVENT) %>%
mutate(SEQ = row_number()) %>%
select(-NUMBER, -name) %>%
pivot_wider(names_from = SEQ, values_from = value)
# EVENT `1` `2` `3` `4` `5` `6` `7` `8` `9` `10`
# <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 A23 6 6 7 7 8 8 9 9 10 10
#2 CD12 13 13 14 14 15 15 16 16 17 17
pivot_longer
和pivot_wider
是gather
和spread
继承者。 如果您还没有更新tidyr
,则可以使用gather
和spread
df %>%
gather(name, value, ends_with('PCT')) %>%
group_by(EVENT, name) %>%
top_n(5, NUMBER) %>%
group_by(EVENT) %>%
mutate(SEQ = row_number()) %>%
select(-NUMBER, -name) %>%
spread(SEQ, value)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.