基于ID的spread()数据框,和另一列中的值
spread() data frame based on ID, and value in another column
我已经查找了几个示例,但没有找到任何过滤启用的值及其日期。
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')
看起来像:
Helper Date(Enabled Value =0) Date (Enabled Value =1)
39RTU1 3/13/2017 6:20 3/20/2017 6:28
39RTU2 3/13/2017 6:21 3/20/2017 6:28
39RTU3 3/13/2017 6:22 3/20/2017 6:28
39RTU4 3/13/2017 6:24 3/20/2017 6:28
39RTU4 3/24/2017 6:28
如您所见,我为每个观察设置了时间戳——每一行都应该是一个实例(即从 Enabled_value 从 0 移动到 1,如果单位的最后一个 Enabled_value = 0,应该换行(见下面的39RTU4)。
我已经做了大量工作来减少这个数据集(从 500k 到 2k 行)。
我正在尝试使用 tidyr
和 dplyr
,但我的 spread
仍然存在 运行 错误。
> sorted_data1<-spread(sorted_data,Enabled_Value,Helper)
Error: Duplicate identifiers for rows (1340, 1342)
根据您尝试传播的方式,这些行似乎不是唯一标识的。所以首先通过 helper 和 enabled value 计算一个索引。 (请注意,我稍微更改了您的示例数据,因为其中一个的长度为 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
我已经查找了几个示例,但没有找到任何过滤启用的值及其日期。
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')
看起来像:
Helper Date(Enabled Value =0) Date (Enabled Value =1)
39RTU1 3/13/2017 6:20 3/20/2017 6:28
39RTU2 3/13/2017 6:21 3/20/2017 6:28
39RTU3 3/13/2017 6:22 3/20/2017 6:28
39RTU4 3/13/2017 6:24 3/20/2017 6:28
39RTU4 3/24/2017 6:28
如您所见,我为每个观察设置了时间戳——每一行都应该是一个实例(即从 Enabled_value 从 0 移动到 1,如果单位的最后一个 Enabled_value = 0,应该换行(见下面的39RTU4)。
我已经做了大量工作来减少这个数据集(从 500k 到 2k 行)。
我正在尝试使用 tidyr
和 dplyr
,但我的 spread
仍然存在 运行 错误。
> sorted_data1<-spread(sorted_data,Enabled_Value,Helper)
Error: Duplicate identifiers for rows (1340, 1342)
根据您尝试传播的方式,这些行似乎不是唯一标识的。所以首先通过 helper 和 enabled value 计算一个索引。 (请注意,我稍微更改了您的示例数据,因为其中一个的长度为 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