有序值 - select 最低值的第一个实例,然后是下一个最低后续值的第一个实例,依此类推
Ordered values - select first instance of lowest value, then first instance of next lowest subsequent value and so on
我有一个包含许多不同 UniqueID 的数据框,它们也按日期排序。每个 UniqueID 从最旧日期到最新日期排序。我们还有一个名为步骤的列,从 1 到 4 排序。
每个 UniqueID 的目标是找到第一步的最旧实例,然后是第二步的最旧实例等。某些步骤可能会丢失,例如 UniqueID = [=47 缺少第 3 步=].在本例中,我们跳过第 3 步并继续执行第 4 步。
这是原始数据框。
UniqueID Date Step
1 A 2015-07-03 2
2 A 2015-07-07 3
3 A 2015-07-09 1
4 A 2015-07-14 4
5 A 2015-07-17 1
6 A 2015-07-20 2
7 A 2015-07-23 2
8 A 2015-07-24 3
9 A 2015-07-29 3
10 B 2015-06-01 3
11 B 2015-06-15 2
12 B 2015-06-22 1
13 B 2015-06-29 4
14 B 2015-07-13 2
15 B 2015-06-22 2
16 B 2015-07-08 2
17 B 2015-07-27 4
我们想要 select 的有效条目是观察值 3、6、8、12、14、17。创建此数据框:
UniqueID Date Step
3 A 2015-07-09 1
6 A 2015-07-20 2
8 A 2015-07-24 3
12 B 2015-06-22 1
14 B 2015-07-13 2
17 B 2015-07-27 4
我有逻辑和一些伪代码,但无法将它们组合在一起。因此,在 UniqueID = "A" 的示例数据框中,我们首先将数据框分组:
group_by(UniqueID)
找到 UniqueID = "A" 的最小值并分配给变量。
v <- min(Step)
returns 1
然后为这一步取索引
i <- which.min(Step)
returns 3
然后我们要找到大于第一步的最小步,并且只搜索出现在第一步之后的元素。所以现在我们只搜索大于 1 的 Step 值,并且只从我们找到的第一个值的位置开始,在本例中是从观察 3 开始。我们希望对每个 UniqueID 的所有观察重复此操作,直到我们要么到达最后一个观察值,或者在剩余元素中再也找不到大于最后一个观察值的观察值。
这是创建示例数据框的输入:
structure(list(UniqueID = structure(c(1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("A",
"B"), class = "factor"), Date = structure(c(16619, 16623, 16625,
16630, 16633, 16636, 16639, 16640, 16645, 16587, 16601, 16608,
16615, 16629, 16608, 16624, 16643), class = "Date"), Step = c(2,
3, 1, 4, 1, 2, 2, 3, 3, 3, 2, 1, 4, 2, 2, 2, 4)), .Names = c("UniqueID",
"Date", "Step"), row.names = c(NA, -17L), class = "data.frame")
替代 dput 使用 jeremycg 的方法崩溃。
structure(list(UniqueID = structure(c(1L, 1L, 1L, 1L, 1L,
2L, 3L, 4L, 5L, 6L, 7L, 8L, 8L, 8L, 9L, 9L, 10L, 11L), .Label = c("A","B",
"C","D","E","F","G","H","I","J","K"),
class = "factor"), Date = c("3/08/2015",
"21/07/2015", "7/07/2015", "7/07/2015", "29/07/2015", "29/07/2015",
"29/06/2015", "13/07/2015", "9/07/2015", "29/07/2015", "24/07/2015",
"2/07/2015", "16/07/2015", "18/06/2015", "8/07/2015", "29/07/2015",
"12/06/2015", "27/07/2015"), Step = c(1, 1, 4, 4, 4, 3,
5, 5, 1, 4, 1, 2, 2, 2, 3, 3, 2, 2)), .Names = c("UniqueID",
"Date", "Step"), class = c("tbl_df", "data.frame"
), row.names = c(NA, -18L))
编辑:即使使用来自 jeremycg 的更新代码,UniqueID 的输出仍继续崩溃:
structure(list(UniqueID = structure(c(1L, 1L, 1L, 1L, 1L, 1L ), .Label = c("A" ), class = "factor"), Date = structure(c(16619, 16623, 16625, 16630, 16633, 16636), class = "Date"), Step = c(1, 5, 5, 1, 1, 1)), .Names = c("UniqueID", "Date", "Step"), row.names = c(NA, -6L), class = "data.frame")
效率很低,但工作正常。
首先定义一个函数:
myseq <- function(df){
if(which.min(df$Step) == nrow(df)){
return(list(df[nrow(df),]))
}
store <- vector(mode = "list", length = nrow(df))
i=1
while(any(!is.na(df$Step))){
store[[i]] <- df[which.min(df$Step),]
df <- df[which.min(df$Step) : nrow(df), ]
df$Step[df$Step == min(df$Step)] <- NA
i = i+1
}
store
}
然后使用 dplyr
:
将其包装在数据框上
library(dplyr)
dta %>% group_by(UniqueID) %>%
do(do.call(rbind, myseq(.)))
Source: local data frame [6 x 3]
Groups: UniqueID
UniqueID Date Step
1 A 2015-07-09 1
2 A 2015-07-20 2
3 A 2015-07-24 3
4 B 2015-06-22 1
5 B 2015-07-13 2
6 B 2015-07-27 4
我有一个包含许多不同 UniqueID 的数据框,它们也按日期排序。每个 UniqueID 从最旧日期到最新日期排序。我们还有一个名为步骤的列,从 1 到 4 排序。
每个 UniqueID 的目标是找到第一步的最旧实例,然后是第二步的最旧实例等。某些步骤可能会丢失,例如 UniqueID = [=47 缺少第 3 步=].在本例中,我们跳过第 3 步并继续执行第 4 步。
这是原始数据框。
UniqueID Date Step
1 A 2015-07-03 2
2 A 2015-07-07 3
3 A 2015-07-09 1
4 A 2015-07-14 4
5 A 2015-07-17 1
6 A 2015-07-20 2
7 A 2015-07-23 2
8 A 2015-07-24 3
9 A 2015-07-29 3
10 B 2015-06-01 3
11 B 2015-06-15 2
12 B 2015-06-22 1
13 B 2015-06-29 4
14 B 2015-07-13 2
15 B 2015-06-22 2
16 B 2015-07-08 2
17 B 2015-07-27 4
我们想要 select 的有效条目是观察值 3、6、8、12、14、17。创建此数据框:
UniqueID Date Step
3 A 2015-07-09 1
6 A 2015-07-20 2
8 A 2015-07-24 3
12 B 2015-06-22 1
14 B 2015-07-13 2
17 B 2015-07-27 4
我有逻辑和一些伪代码,但无法将它们组合在一起。因此,在 UniqueID = "A" 的示例数据框中,我们首先将数据框分组:
group_by(UniqueID)
找到 UniqueID = "A" 的最小值并分配给变量。
v <- min(Step)
returns 1
然后为这一步取索引
i <- which.min(Step)
returns 3
然后我们要找到大于第一步的最小步,并且只搜索出现在第一步之后的元素。所以现在我们只搜索大于 1 的 Step 值,并且只从我们找到的第一个值的位置开始,在本例中是从观察 3 开始。我们希望对每个 UniqueID 的所有观察重复此操作,直到我们要么到达最后一个观察值,或者在剩余元素中再也找不到大于最后一个观察值的观察值。
这是创建示例数据框的输入:
structure(list(UniqueID = structure(c(1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("A",
"B"), class = "factor"), Date = structure(c(16619, 16623, 16625,
16630, 16633, 16636, 16639, 16640, 16645, 16587, 16601, 16608,
16615, 16629, 16608, 16624, 16643), class = "Date"), Step = c(2,
3, 1, 4, 1, 2, 2, 3, 3, 3, 2, 1, 4, 2, 2, 2, 4)), .Names = c("UniqueID",
"Date", "Step"), row.names = c(NA, -17L), class = "data.frame")
替代 dput 使用 jeremycg 的方法崩溃。
structure(list(UniqueID = structure(c(1L, 1L, 1L, 1L, 1L,
2L, 3L, 4L, 5L, 6L, 7L, 8L, 8L, 8L, 9L, 9L, 10L, 11L), .Label = c("A","B",
"C","D","E","F","G","H","I","J","K"),
class = "factor"), Date = c("3/08/2015",
"21/07/2015", "7/07/2015", "7/07/2015", "29/07/2015", "29/07/2015",
"29/06/2015", "13/07/2015", "9/07/2015", "29/07/2015", "24/07/2015",
"2/07/2015", "16/07/2015", "18/06/2015", "8/07/2015", "29/07/2015",
"12/06/2015", "27/07/2015"), Step = c(1, 1, 4, 4, 4, 3,
5, 5, 1, 4, 1, 2, 2, 2, 3, 3, 2, 2)), .Names = c("UniqueID",
"Date", "Step"), class = c("tbl_df", "data.frame"
), row.names = c(NA, -18L))
编辑:即使使用来自 jeremycg 的更新代码,UniqueID 的输出仍继续崩溃:
structure(list(UniqueID = structure(c(1L, 1L, 1L, 1L, 1L, 1L ), .Label = c("A" ), class = "factor"), Date = structure(c(16619, 16623, 16625, 16630, 16633, 16636), class = "Date"), Step = c(1, 5, 5, 1, 1, 1)), .Names = c("UniqueID", "Date", "Step"), row.names = c(NA, -6L), class = "data.frame")
效率很低,但工作正常。
首先定义一个函数:
myseq <- function(df){
if(which.min(df$Step) == nrow(df)){
return(list(df[nrow(df),]))
}
store <- vector(mode = "list", length = nrow(df))
i=1
while(any(!is.na(df$Step))){
store[[i]] <- df[which.min(df$Step),]
df <- df[which.min(df$Step) : nrow(df), ]
df$Step[df$Step == min(df$Step)] <- NA
i = i+1
}
store
}
然后使用 dplyr
:
library(dplyr)
dta %>% group_by(UniqueID) %>%
do(do.call(rbind, myseq(.)))
Source: local data frame [6 x 3]
Groups: UniqueID
UniqueID Date Step
1 A 2015-07-09 1
2 A 2015-07-20 2
3 A 2015-07-24 3
4 B 2015-06-22 1
5 B 2015-07-13 2
6 B 2015-07-27 4