我在R中使用dplyr对数据进行了分组。我想找到' date'在每组中最后一次观察(' B')等于或大于1(1,2,3或4)之后(' A')。换句话说,' date'其中1/2/3/4已变为0。
简单地找到第一次出现0的日期将不起作用,因为在某些组1/2/3/4切换到0然后再返回并且不会给出结果我喜欢。
我希望这个' date'为每个组提供一个新列(' date.after')。
例如,给定以下数据样本,按A分组(这已经简化,我的数据实际上按3个变量分组):
A B date
a 2 1
a 2 2
a 1 5
a 0 8
b 3 1
b 3 4
b 3 6
b 0 7
b 0 9
c 1 2
c 1 3
c 1 4
我想实现以下目标:
A B date date.after
a 2 1 8
a 2 2 8
a 1 5 8
a 0 8 8
b 3 1 7
b 3 4 7
b 3 6 7
b 0 7 7
b 0 9 7
c 1 2 NA
c 1 3 NA
c 1 4 NA
我希望这是有道理的,非常感谢你的帮助! 这篇文章可能看起来很熟悉,我刚刚问了一个非常相似的问题:
How to find the last occurrence of a certain observation in grouped data in R?
答案 0 :(得分:5)
这是一个dplyr选项:
df %>% group_by(A) %>% mutate(date_after = date[last(which(B >= 1)) + 1])
#Source: local data frame [12 x 4]
#Groups: A [3]
#
# A B date date_after
# (fctr) (int) (int) (int)
#1 a 2 1 8
#2 a 2 2 8
#3 a 1 5 8
#4 a 0 8 8
#5 b 3 1 7
#6 b 3 4 7
#7 b 3 6 7
#8 b 0 7 7
#9 b 0 9 7
#10 c 1 2 NA
#11 c 1 3 NA
#12 c 1 4 NA
或者,您可以使用dplyr的nth
函数:
df %>% group_by(A) %>% mutate(date_after = nth(date, last(which(B >= 1)) + 1))
它的作用(在两种情况下):它计算B
的最后一个条目的位置等于或大于1,然后将1添加到该索引并返回该位置的date
。如果该位置不可用,则返回NA
(如最后一组中的情况)。
您可以使用以下命令在data.table中执行完全相同的操作:
library(data.table)
setDT(df)[, date_after := date[last(which(B >= 1)) + 1], by = A]
答案 1 :(得分:0)
我选择了dplyr,因为我认为代码比data.table
更容易阅读library(dplyr)
df %>%
group_by(A) %>%
mutate(
Date0 = date[B == 0][1]
)