添加要在spread()中使用的新列名

添加要在spread()中使用的新列名,r,dplyr,tidyr,R,Dplyr,Tidyr,大图:我正在尝试设置一个导出,该导出将一个路由作为行,并为每个值设置列 这段代码:我试图使用切片1:3为每条路线选择前三个传输,因为我需要的值不超过三个。上衣可以系领带。然后,我尝试创建6列:每个列有一个名称和一个pct 如果我现在分散数据,名称将变成列,但我需要将名称保留在行中,以查看所需的输出。我想创建列名作为用于传播的键列。我的方法是制造一个错误。我很难想出另一个策略 数据帧: 一个tibble:7x3 路由\u短名称传输\u到pct 1 A D 0.5 2 A E 0.5 3 B F

大图:我正在尝试设置一个导出,该导出将一个路由作为行,并为每个值设置列

这段代码:我试图使用切片1:3为每条路线选择前三个传输,因为我需要的值不超过三个。上衣可以系领带。然后,我尝试创建6列:每个列有一个名称和一个pct

如果我现在分散数据,名称将变成列,但我需要将名称保留在行中,以查看所需的输出。我想创建列名作为用于传播的键列。我的方法是制造一个错误。我很难想出另一个策略

数据帧:

一个tibble:7x3 路由\u短名称传输\u到pct 1 A D 0.5 2 A E 0.5 3 B F 0.667 4 B G 0.333 5cd0.111 6ce0.111 7 C G 0.111 期望输出:

一个tibble:3x7 路由\u短名称传输1传输1\u pct传输2\u pct传输3\u pct传输 1 A D 0.5 E 0.5 NA 2bf0.667g0.333na 3cd0.111e0.111g0.111 雷普雷克斯:

图书馆管理员 样本数据% mutatekey=CtrTransfer1,transfer2,transfer3 >mutate_impl.data,dots出错:列'key'的长度必须是组大小的2或1,而不是3
虽然您用tidyverse软件包标记了这个问题,但这里有一个选项,使用data.table中的dcast,您可以在一条公认的长线中进行重塑

library(data.table)
setDT(sample_data)
dcast(sample_data, route_shortname ~ rowid(route_shortname), value.var = c('transfer_to', 'pct'))
#   route_shortname transfer_to_1 transfer_to_2 transfer_to_3     pct_1     pct_2     pct_3
#1:               A             D             E          <NA> 0.5000000 0.5000000        NA
#2:               B             F             G          <NA> 0.6666667 0.3333333        NA
#3:               C             D             E             G 0.1111111 0.1111111 0.1111111

在这两种情况下,您都需要重命名列,但这应该不会太难。

是否可以在此处使用一个函数来避免多次调用分隔列?像是带转移的突变,funs。。。或者利用purrr?我不知道有什么方法可以执行多个单独的操作,即在多个列中执行。data.table包,如下面的答案,或重塑包可以做到这一点。
library(data.table)
setDT(sample_data)
dcast(sample_data, route_shortname ~ rowid(route_shortname), value.var = c('transfer_to', 'pct'))
#   route_shortname transfer_to_1 transfer_to_2 transfer_to_3     pct_1     pct_2     pct_3
#1:               A             D             E          <NA> 0.5000000 0.5000000        NA
#2:               B             F             G          <NA> 0.6666667 0.3333333        NA
#3:               C             D             E             G 0.1111111 0.1111111 0.1111111
sample_data <- as.data.frame(sample_data) # does not work with tibbles for some reason
sample_data$idx <- with(sample_data,
                        ave(route_shortname, route_shortname, FUN = seq_along))
reshape(sample_data, idvar = "route_shortname", timevar = "idx", direction = "wide", sep = "_")
#  route_shortname transfer_to_1     pct_1 transfer_to_2     pct_2 transfer_to_3     pct_3
#1               A             D 0.5000000             E 0.5000000          <NA>        NA
#3               B             F 0.6666667             G 0.3333333          <NA>        NA
#5               C             D 0.1111111             E 0.1111111             G 0.1111111