群集因子的唯一值

时间:2018-03-30 21:56:32

标签: r for-loop clustered-index

我知道我做错了什么,我只是无法确定究竟是什么。

我有一些长格式的数据,包括Pseudo_ID,UpdateDateO和UpdateTimeO。时间聚集在日期内,日期在ID内。我想为UpdateDateO(取决于ID)和UpdateTimeO(取决于日期和ID)分配唯一值(索引)。这是一些数据:

Pseudo_ID   UpdateDateO UpdateTimeO
1   2-6-2012    95740000
1   2-6-2012    95740001
1   2-6-2012    95740002
1   3-6-2012    182642000
1   3-6-2012    182642001
1   4-6-2012    182642002
1   4-6-2012    182643000
2   20-5-2012   34040000
2   20-5-2012   101944000
2   20-5-2012   101944001
2   22-5-2012   101944002
2   22-5-2012   190936000
2   23-5-2012   190936001
2   23-5-2012   190936002
3   18-9-2013   20836000
3   18-9-2013   20836001
3   18-9-2013   20836002
3   19-9-2013   20836003
3   19-9-2013   132209000 
3   19-9-2013   132209001
3   20-9-2013   114636000
3   21-9-2013   114636001
4   4-4-2014    101347000
4   4-4-2014    101347001
4   5-4-2014    101347002
4   5-4-2014    101347003
4   5-4-2014    101347004
4   5-4-2014    192216000
4   5-4-2014    192216001
4   6-4-2014    192216002
4   6-4-2014    192216003
4   6-4-2014    192216004
4   7-4-2014    180337000
4   7-4-2014    180337001
4   7-4-2014    180337002
5   1-12-2016   111830000
5   1-12-2016   111830001
5   1-12-2016   111830002
5   1-12-2016   111830003
5   1-12-2016   192131000
5   2-12-2016   192131001
5   3-12-2016   192131002
5   3-12-2016   111831000
5   3-12-2016   111831001
5   3-12-2016   111831002

我决定创建一个for循环:

for (i in unique(data$Pseudo_ID)) data$Day[data$Pseudo_ID == i]  <- match(data$UpdateDateO, unique(data$UpdateDateO)) 
for (i in unique(data$Day)) data$Time[data$Day == i] <- match(data$UpdateTimeO, unique(data$UpdateTimeO))

首先,它给了我一个警告:要替换的项目数量不是替换长度的倍数。其次,它会生成错误的输出((dis)类似日期/时间的错误值)。此外,我希望每个新参与者的日期从1开始,以及一天内的每个(第一个)时间点。我知道我没有以正确的方式使用for循环,但此时我只是不知道了。

这是输出:

Pseudo_ID UpdateDateO UpdateTimeO Day Time
 1    2-6-2012    95740000   1    1
 1    2-6-2012    95740001   1    2
 1    2-6-2012    95740002   1    3
 1    3-6-2012   182642000   2    1
 1    3-6-2012   182642001   2    2
 1    4-6-2012   182642002   3    1
 1    4-6-2012   182643000   3    2
 2   20-5-2012    34040000   1    4
 2   20-5-2012   101944000   1    5
 2   20-5-2012   101944001   1    6
 2   22-5-2012   101944002   2    3
 2   22-5-2012   190936000   2    4
 2   23-5-2012   190936001   3    3
 2   23-5-2012   190936002   3    4
 3   18-9-2013    20836000   1    7
 3   18-9-2013    20836001   1    8
 3   18-9-2013    20836002   1    9
 3   19-9-2013    20836003   2    5
 3   19-9-2013   132209000   2    6
 3   19-9-2013   132209001   3    5
 3   20-9-2013   114636000   3    6
 3   21-9-2013   114636001   4    1
 4    4-4-2014   101347000   1   10
 4    4-4-2014   101347001   1   11
 4    5-4-2014   101347002   1   12
 4    5-4-2014   101347003   2    7
 4    5-4-2014   101347004   2    8
 4    5-4-2014   192216000   3    7
 4    5-4-2014   192216001   3    8
 4    6-4-2014   192216002   4    2
 4    6-4-2014   192216003   4    3
 4    6-4-2014   192216004   4    4
 4    7-4-2014   180337000   5    1
 4    7-4-2014   180337001   5    2
 4    7-4-2014   180337002   6    1
 5   1-12-2016   111830000   1   13
 5   1-12-2016   111830001   1   14
 5   1-12-2016   111830002   1   15
 5   1-12-2016   111830003   2    9
 5   1-12-2016   192131000   2   10
 5   2-12-2016   192131001   3    9
 5   3-12-2016   192131002   3   10
 5   3-12-2016   111831000   4    5
 5   3-12-2016   111831001   4    6
 5   3-12-2016   111831002   4    7

我希望看到类似的内容:

Pseudo_ID   UpdateDateO UpdateTimeO Day Time
1   2-6-2012    95740000    1   1
1   2-6-2012    95740001    1   2
1   2-6-2012    95740002    1   3
1   2-6-2012    95740002    1   3
1   3-6-2012    182642000   2   1
1   3-6-2012    182642001   2   2
1   4-6-2012    182642002   3   1
1   4-6-2012    182643000   3   2
2   20-5-2012   34040000    1   1
2   20-5-2012   101944000   1   2
2   20-5-2012   101944001   1   3  
2   22-5-2012   101944002   2   1
2   22-5-2012   101944002   2   1
2   22-5-2012   101944002   2   1
2   22-5-2012   190936000   2   2
2   23-5-2012   190936001   3   1
2   23-5-2012   190936002   3   2
3   18-9-2013   20836000    1   1
3   18-9-2013   20836001    1   2
3   18-9-2013   20836001    1   2
3   18-9-2013   20836001    1   2
3   18-9-2013   20836002    1   3
3   19-9-2013   20836003    2   1  
3   19-9-2013   132209000   2   2
3   19-9-2013   132209000   2   2
3   19-9-2013   132209000   2   2
3   19-9-2013   132209001   2   3
3   20-9-2013   114636000   3   1
3   21-9-2013   114636001   4   1

1 个答案:

答案 0 :(得分:0)

使用dplyrrleid中的data.table函数创建分组变量的解决方案更容易:

df = read.table(text = "
Pseudo_ID   UpdateDateO UpdateTimeO
1   2-6-2012    95740000    
1   2-6-2012    95740001   
1   2-6-2012    95740002    
1   2-6-2012    95740002    
1   3-6-2012    182642000   
1   3-6-2012    182642001   
1   4-6-2012    182642002   
1   4-6-2012    182643000   
2   20-5-2012   34040000    
2   20-5-2012   101944000   
2   20-5-2012   101944001     
2   22-5-2012   101944002   
2   22-5-2012   101944002   
2   22-5-2012   101944002   
2   22-5-2012   190936000   
2   23-5-2012   190936001   
2   23-5-2012   190936002   
", header=T)

library(dplyr)
library(data.table)

df %>%
  group_by(Pseudo_ID) %>%
  mutate(Day = rleid(UpdateDateO)) %>%
  group_by(Pseudo_ID, UpdateDateO) %>%
  mutate(Time = rleid(UpdateTimeO)) %>%
  ungroup()

# # A tibble: 17 x 5
#   Pseudo_ID UpdateDateO UpdateTimeO   Day  Time
#       <int> <fct>             <int> <int> <int>
# 1         1 2-6-2012       95740000     1     1
# 2         1 2-6-2012       95740001     1     2
# 3         1 2-6-2012       95740002     1     3
# 4         1 2-6-2012       95740002     1     3
# 5         1 3-6-2012      182642000     2     1
# 6         1 3-6-2012      182642001     2     2
# 7         1 4-6-2012      182642002     3     1
# 8         1 4-6-2012      182643000     3     2
# 9         2 20-5-2012      34040000     1     1
#10         2 20-5-2012     101944000     1     2
#11         2 20-5-2012     101944001     1     3
#12         2 22-5-2012     101944002     2     1
#13         2 22-5-2012     101944002     2     1
#14         2 22-5-2012     101944002     2     1
#15         2 22-5-2012     190936000     2     2
#16         2 23-5-2012     190936001     3     1
#17         2 23-5-2012     190936002     3     2