确定排序数据框中最后一个因子的观察结果

时间:2015-07-10 16:59:43

标签: r

我正在尝试向我的数据框添加一个变量,该变量指示哪个因子的观察值是最后一个。基本上,我想要创建的内容在下面表示为lastobs变量。

id       date  val obsnum lastobs
 A 1999-01-05    5      1       0
 A 1999-01-05    9      2       0
 A 1999-02-14    4      3       1
 B 1999-03-19    7      1       1
 C 1999-02-14   10      1       1

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

library(dplyr)
df %>% group_by(id) %>% mutate(lastobs = +(row_number() == n()))
# Source: local data frame [5 x 5]
# Groups: id
# 
#   id       date val obsnum lastobs
# 1  A 1999-01-05   5      1       0
# 2  A 1999-01-05   9      2       0
# 3  A 1999-02-14   4      3       1
# 4  B 1999-03-19   7      1       1
# 5  C 1999-02-14  10      1       1

<强>解释

dplyr是一个非常有用的软件包,可以熟悉新用户。它将简化并加速这样的任务。符号%>%称为管道,几乎创建一种句子格式,其中每个语句都链接在一起。我首先输入我们使用df的数据框的名称,然后输入我们将按id对结果进行分组的变量。然后,我们创建一个名为lastobs的新列,该列由一个匹配的命令组成,该命令检查每个观察是否是最后一次观察。外部的加号将TRUE和FALSE结果变为1和0。

使用base R

df$lastobs <- unlist(with(df, tapply(val, id, FUN=
                                     function(x) (seq_along(x) == length(x))+0L)))

使用data.table包(credit:@akrun):

setDT(df)[, lastobs := +(1:.N==.N), id]

数据

df <- read.table(text='
id       date  val obsnum lastobs
 A 1999-01-05    5      1       0
 A 1999-01-05    9      2       0
 A 1999-02-14    4      3       1
 B 1999-03-19    7      1       1
 C 1999-02-14   10      1       1', header=T)

df <- df[,-5]