希望基于三个现有变量创建新变量X:“ SubID”,“ Day”和“ Time”。我曾经在excel中具有三个排序功能来手动执行此操作:首先按“ SubID”进行排序,然后按“ Day”进行排序,最后按“ Time”进行排序。根据日期和时间的顺序,每个SubID的X应该从1到最大行数。
SubID:分配的主题编号
日期:每个主题的日期编号(1,2,3 ... 21)
时间:1、2、3
X:标记为相同SubID的行数
SubID Day Time X
1 1 1 1
1 1 2 2
1 1 3 3
1 2 1 4
1 2 2 5
2 1 1 1
2 1 2 2
2 1 3 3
2 2 3 6
2 2 2 5
2 2 1 4
我一直在excel中手动执行此操作,并且我肯定必须有一种更聪明的方法来在R中执行此操作,但是我对R还是陌生的,并且不知道如何操作。预先谢谢你!
答案 0 :(得分:1)
可能对您有帮助
library(dplyr)
df1 %>%
group_by(SubID) %>%
mutate(X1 = row_number(as.numeric(paste0(Day, Time))))
# A tibble: 11 x 5
# Groups: SubID [2]
# SubID Day Time X X1
# <int> <int> <int> <int> <int>
# 1 1 1 1 1 1
# 2 1 1 2 2 2
# 3 1 1 3 3 3
# 4 1 2 1 4 4
# 5 1 2 2 5 5
# 6 2 1 1 1 1
# 7 2 1 2 2 2
# 8 2 1 3 3 3
# 9 2 2 3 6 6
#10 2 2 2 5 5
#11 2 2 1 4 4
或使用order
df1 %>%
group_by(SubID) %>%
mutate(X1 = order(Day, Time))
或与data.table
library(data.table)
setDT(df1)[, X1 := order(Day, Time), by = SubID]
df1 <- structure(list(SubID = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L,
2L, 2L), Day = c(1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L),
Time = c(1L, 2L, 3L, 1L, 2L, 1L, 2L, 3L, 3L, 2L, 1L), X = c(1L,
2L, 3L, 4L, 5L, 1L, 2L, 3L, 6L, 5L, 4L)), class = "data.frame",
row.names = c(NA,
-11L))
答案 1 :(得分:1)
可能与data.table包一起使用。如果尚未安装,则必须安装它。我已经注释了该命令。
# install.packages("data.table")
library(data.table)
我们可以通过以下方式生成您的数据。
df <- data.frame(SubId=sample(1:2,10,replace=TRUE),
Day=sample(1:2,10,replace=TRUE),
Time=sample(1:2,10,replace=TRUE))
然后将data.frame转换为data.table。
setDT(df)
##> df
## SubId Day Time
## 1: 1 2 1
## 2: 1 1 1
## 3: 1 1 2
## 4: 2 2 1
## 5: 2 1 1
## 6: 1 2 2
## 7: 1 2 1
## 8: 1 2 2
## 9: 2 1 1
## 10: 2 1 2
最后,我们可以订购我的SubId,Day,Time。根据需要对表进行排序后,我们只需将行从1编号到每个SubId中的观察值的数量即可。
df[order(SubId,Day,Time),X:=1:.N,SubId]
##> df
## SubId Day Time X
## 1: 1 2 1 3
## 2: 1 1 1 1
## 3: 1 1 2 2
## 4: 2 2 1 4
## 5: 2 1 1 1
## 6: 1 2 2 5
## 7: 1 2 1 4
## 8: 1 2 2 6
## 9: 2 1 1 2
## 10: 2 1 2 3