聚类因子的唯一值
Unique values for clustered factors
我知道我做错了什么,只是无法准确指出具体是什么。
我有一些长格式的数据,由 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)similar days/times 的值不正确)。另外,我希望每个新参与者以及一天中的每个(第一个)时间点的日子都从 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
使用 dplyr
和 data.table
中的函数 rleid
更容易创建分组变量的解决方案:
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
我知道我做错了什么,只是无法准确指出具体是什么。
我有一些长格式的数据,由 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)similar days/times 的值不正确)。另外,我希望每个新参与者以及一天中的每个(第一个)时间点的日子都从 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
使用 dplyr
和 data.table
中的函数 rleid
更容易创建分组变量的解决方案:
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