R 确定已排序数据框内某个因素的最后一次观察结果

R 确定已排序数据框内某个因素的最后一次观察结果,r,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

我试图在我的数据框中添加一个变量,以指示哪一个因子的观测值是最后一个。基本上,我想创建的是下面的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
任何帮助都将不胜感激

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
的新列,该列包含一个匹配的命令,该命令检查每个观察是否是最后一个观察。外部的加号将正确和错误结果转换为1和0

基本R

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

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]

df我还没有尝试任何特定的代码。我对R很陌生:我真的在本周早些时候才开始阅读和使用它。我翻阅了我的参考书《R在行动》,并寻找了关于stackoverflow的类似问题的答案。我可以准确地想到我将如何在Excel中实现它,但我只是对R函数不够熟悉,不知道如何最好地实现这一点。如果我忽略了一些显而易见的事情,我会道歉。我正在尽我最大的努力在很短的时间内快速学习。如果解决方案有帮助,你可以通过在答案旁边勾选来接受。谢谢。data.table解决方案奏效了,但我对您提出的第一个解决方案有点纠结,它使用了dplyr包。我刚刚发布了对下面的链接的回复。这并不重要,但我想了解我所描述的错误发生的原因(可能这属于另一篇文章?如果我在这里违反了任何规则,请道歉),特别是如果dplyr包,正如您所建议的,对于这些类型的练习来说是一个很好的熟悉包。谢谢您将添加到回答
ave
是另一个选项,向df添加向量比向df添加向量更标准的是:
使用(df,ave(val,id,FUN=function(x)+(seq_沿着(x)=length(x)))
(在任何情况下,我都不喜欢基本R选项。)此外,您可以在其他人之前添加data.table。我也不喜欢基本R方法。它很笨重。我只是有点错过了使用
tapply
,如果这是一个新用户,我认为data.table会非常混乱,因为在base R中子集本身就是一个足够陡峭的学习曲线。或者使用
data.table
setDT(df)[,lastobs:=+(1:.N=.N),id]
再次感谢您的回复。我能够使用data.table的setDF函数成功地创建“lastobs”变量。但是,我在应用dplyr解决方案时遇到了困难。现在我收到一条错误消息,上面写着:秩中的错误(x,ties.method=“first”,na.last=“keep”):缺少参数“x”,没有默认值。我试着在谷歌上快速搜索那个特定的错误信息,但还没有发现任何有用的东西。这可能是由于dplyr和data.table同时存在造成的吗?
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]