基于ID和另一列中的值的spread()数据帧

基于ID和另一列中的值的spread()数据帧,r,dplyr,tidyr,R,Dplyr,Tidyr,我已经查找了几个示例,但没有找到任何过滤启用值及其日期的示例 Date <-c('3/13/2017 6:21', '3/20/2017 6:28','3/13/2017 6:22','3/20/2017 6:28',' 3/13/2017 6:23','3/20/2017 6:28','3/13/2017 6:24',' 3/20/2017 6:28', ' 3/24/2017 6:28') Enabled_value<-c(0,1,0,1,0,1,0,1,0) Helper<

我已经查找了几个示例,但没有找到任何过滤启用值及其日期的示例

Date <-c('3/13/2017 6:21', '3/20/2017 6:28','3/13/2017 6:22','3/20/2017 6:28',' 3/13/2017 6:23','3/20/2017 6:28','3/13/2017 6:24',' 3/20/2017 6:28', ' 3/24/2017 6:28')
Enabled_value<-c(0,1,0,1,0,1,0,1,0)
Helper<-c('39RTU1','39RTU1','39RTU2','39RTU2','39RTU2','39RTU3','39RTU3','39RTU4','39RTU4', '39RTU4')
如您所见,我对每个观察都有时间戳-每一行都应该是一个实例(即,从启用的_值从0移动到1,如果单元的最后一个启用的_值=0,则应该有一个新行(参见下面的39RTU4)

我已经做了大量的工作来减少这个数据集(从500k到2k行)

我正在尝试使用
tidyr
dplyr
,但我的
spread
一直运行错误

> sorted_data1<-spread(sorted_data,Enabled_Value,Helper)
Error: Duplicate identifiers for rows (1340, 1342)

>排序的_data1看起来这些行并不是根据您试图传播的方式唯一标识的。因此,首先根据帮助器和启用值计算索引。(注意,我稍微更改了示例数据,因为其中一个长度为10,而另外两个长度为9)

希望这有帮助。如果这不是你想要的,请随时进一步澄清

Date <-c('3/13/2017 6:21', '3/20/2017 6:28','3/13/2017 6:22','3/20/2017 6:28',' 3/13/2017 6:23','3/20/2017 6:28','3/13/2017 6:24',' 3/20/2017 6:28', ' 3/24/2017 6:28')
Enabled_value<-c(0,1,0,1,0,1,0,1,0)
Helper<-c('39RTU1','39RTU1','39RTU2','39RTU2','39RTU2','39RTU3','39RTU3','39RTU4','39RTU4')

df <- tibble(Date, Enabled_value, Helper)
df %>% 
  group_by(Helper, Enabled_value) %>% 
  mutate(count = 1:n()) %>% 
  spread(Enabled_value, Date) %>% 
  rename(Enabled_value_0 = `0`,
         Enabled_value_1 = `1`)

# A tibble: 5 x 4
# Groups:   Helper [4]
  Helper count Enabled_value_0 Enabled_value_1
*  <chr> <int>           <chr>           <chr>
1 39RTU1     1  3/13/2017 6:21  3/20/2017 6:28
2 39RTU2     1  3/13/2017 6:22  3/20/2017 6:28
3 39RTU2     2  3/13/2017 6:23            <NA>
4 39RTU3     1  3/13/2017 6:24  3/20/2017 6:28
5 39RTU4     1  3/24/2017 6:28  3/20/2017 6:28
日期%
重命名(已启用\u值\u 0=`0`,
已启用的\u值\u 1=`1`)
#一个tibble:5x4
#组别:Helper[4]
助手计数已启用\u值\u 0已启用\u值\u 1
*                         
1391 1 1 3/13/2017 6:21 3/20/2017 6:28
2 39RTU2 1 3/13/2017 6:22 3/20/2017 6:28
3 392 2 3/13/2017 6:23
4 39RTU3 1 3/13/2017 6:24 3/20/2017 6:28
5 39RTU4 1 3/24/2017 6:28 3/20/2017 6:28

我认为这个问题与如果您在管道链的开头添加
mutate_at(Enabled_value,as.character)
有关,您可以保存一行,即使没有这行,也可以清晰地手动重命名列名。我只是在末尾进行了手动重命名,以使它们更好地匹配(否则列名将是
0
1
)。我也可以在mutate中添加一行,我已经在排列前将“Enabled_value_uu”粘贴到每个数字上。我实际上觉得在这种情况下手动重命名更为清晰,但肯定两者都可以。
Date <-c('3/13/2017 6:21', '3/20/2017 6:28','3/13/2017 6:22','3/20/2017 6:28',' 3/13/2017 6:23','3/20/2017 6:28','3/13/2017 6:24',' 3/20/2017 6:28', ' 3/24/2017 6:28')
Enabled_value<-c(0,1,0,1,0,1,0,1,0)
Helper<-c('39RTU1','39RTU1','39RTU2','39RTU2','39RTU2','39RTU3','39RTU3','39RTU4','39RTU4')

df <- tibble(Date, Enabled_value, Helper)
df %>% 
  group_by(Helper, Enabled_value) %>% 
  mutate(count = 1:n()) %>% 
  spread(Enabled_value, Date) %>% 
  rename(Enabled_value_0 = `0`,
         Enabled_value_1 = `1`)

# A tibble: 5 x 4
# Groups:   Helper [4]
  Helper count Enabled_value_0 Enabled_value_1
*  <chr> <int>           <chr>           <chr>
1 39RTU1     1  3/13/2017 6:21  3/20/2017 6:28
2 39RTU2     1  3/13/2017 6:22  3/20/2017 6:28
3 39RTU2     2  3/13/2017 6:23            <NA>
4 39RTU3     1  3/13/2017 6:24  3/20/2017 6:28
5 39RTU4     1  3/24/2017 6:28  3/20/2017 6:28