我正在尝试向我的数据框添加一个变量,该变量指示哪个因子的观察值是最后一个。基本上,我想要创建的内容在下面表示为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
非常感谢任何帮助。
答案 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]