r如何检查上一期间是否存在值(滚动)
这是我的数据集:r如何检查上一期间是否存在值(滚动),r,R,这是我的数据集: structure(list(Date = structure(c(14609, 14609, 14609, 14609, 14699, 14699, 14699, 14699, 14790, 14790, 14790, 14790), class = "Date"), ID = structure(c(5L, 4L, 6L, 10L, 9L, 3L, 10L, 8L, 7L, 1L, 10L, 2L), .Label = c("B00NYQ2", "B03J9L7", "
structure(list(Date = structure(c(14609, 14609, 14609, 14609, 14699, 14699, 14699, 14699, 14790, 14790, 14790, 14790), class = "Date"),
ID = structure(c(5L, 4L, 6L, 10L, 9L, 3L, 10L, 8L, 7L, 1L,
10L, 2L), .Label = c("B00NYQ2", "B03J9L7", "B05DZD1", "B06HC42",
"B09V3X7", "B09YCC8", "X6114659", "X6478816", "X6556701",
"X6812555"), class = "factor"), Name = structure(c(10L, 4L,
9L, 8L, 7L, 3L, 8L, 6L, 2L, 5L, 8L, 1L), .Label = c("AIRA",
"BOUS", "CSCS", "EVF", "GTB", "JER", "MGB", "MPR", "NVB",
"TTNP"), class = "factor"), Score = c(55.075, 54.5, 53.325,
52.175, 70.275, 69.825, 60.15, 60.025, 56.175, 52.65, 52.175,
52.125), Score.rank = c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L,
2L, 3L, 4L)), .Names = c("Date", "ID", "Name", "Score", "Score.rank"), row.names = c(1L, 2L, 3L, 4L, 71L, 72L, 73L, 74L, 156L, 157L, 158L, 159L), class = "data.frame")
当我们进入一个新的时期时,我试图找出哪些ID进出
我的意思是..我想比较ID是否出现在前一个时期,用“日期”表示
如果它存在于前一个期间(日期),则不应返回任何内容
如果上一期间不存在,则应返回“in”
我还想表明,如果在下一个期间不存在,它应该返回一个“OUT”。
即本期的出局应等于下一期的出局
我预期的数据帧应该是这样的
Date ID Name Score Score.rank THIS PERIOD NEXT PERIOD
31/12/2009 B09V3X7 TTNP 55.075 1 OUT
31/12/2009 B06HC42 EVF 54.5 2 OUT
31/12/2009 B09YCC8 NVB 53.325 3 OUT
31/12/2009 X6812555 MPR 52.175 4
31/3/2010 X6556701 MGB 70.275 1 IN
31/3/2010 B05DZD1 CSCS 69.825 2 IN OUT
31/3/2010 X6812555 MPR 60.15 3
31/3/2010 X6478816 JER 60.025 4 IN OUT
30/6/2010 X6114659 BOUS 56.175 1 IN
30/6/2010 B00NYQ2 GTB 52.65 2 IN
30/6/2010 X6812555 MPR 52.175 3
30/6/2010 B03J9L7 AIRA 52.125 4 IN
有人能告诉我怎么做吗?
提前感谢很遗憾,您的描述和示例不匹配。 考虑到您的描述,您似乎希望标记ID的进入和退出条件 可通过以下方式实现:
dft %>%
group_by(ID) %>%
dplyr::mutate( This_period = if_else(Date == min(Date), "IN", NULL) ) %>%
dplyr::mutate( Next_period = if_else(Date == max(Date), "OUT", NULL))
并返回:
#Source: local data frame [12 x 7]
#Groups: ID [10]
#
# Date ID Name Score Score.rank This_period Next_period
# <date> <fctr> <fctr> <dbl> <int> <chr> <chr>
#1 2009-12-31 B09V3X7 TTNP 55.075 1 IN OUT
#2 2009-12-31 B06HC42 EVF 54.500 2 IN OUT
#3 2009-12-31 B09YCC8 NVB 53.325 3 IN OUT
#4 2009-12-31 X6812555 MPR 52.175 4 IN <NA>
#5 2010-03-31 X6556701 MGB 70.275 1 IN OUT
#6 2010-03-31 B05DZD1 CSCS 69.825 2 IN OUT
#7 2010-03-31 X6812555 MPR 60.150 3 <NA> <NA>
#8 2010-03-31 X6478816 JER 60.025 4 IN OUT
#9 2010-06-30 X6114659 BOUS 56.175 1 IN OUT
#10 2010-06-30 B00NYQ2 GTB 52.650 2 IN OUT
#11 2010-06-30 X6812555 MPR 52.175 3 <NA> OUT
#12 2010-06-30 B03J9L7 AIRA 52.125 4 IN OUT
#来源:本地数据帧[12 x 7]
#组别:ID[10]
#
#Date ID Name Score Score.rank此\u时段下一个\u时段
#
#2009年12月31日B09V3X7 TTNP 55.075 1输入输出
#2 2009-12-31 B06HC42 EVF 54.500 2输入输出
#3 2009-12-31 B09YCC8 NVB 53.325 3输入输出
#4 2009-12-31 X6812555 MPR 52.175 4英寸
#5 2010-03-31 X6556701 MGB 70.275 1输入输出
#6 2010-03-31 B05DZD1 CSCS 69.825 2输入输出
#7 2010-03-31 X6812555 MPR 60.150 3
#8 2010-03-31 X6478816 JER 60.025 4输入输出
#9 2010-06-30 X6114659 BOUS 56.175 1输入输出
#10 2010-06-30 B00NYQ2 GTB 52.650 2输入输出
#11 2010-06-30 X6812555 MPR 52.175 3输出
#12 2010-06-30 B03J9L7 AIRA 52.125 4输入输出
但是,您的示例建议您将min(Date)
从本期检查中排除,将max(Date)
从下一期检查中排除。是这样吗?如果是,则得分.排名是否与日期相关?
请澄清 谢谢你。好的,让我试着重新发布数据。好的,如果有帮助的话,我扩展了数据集?你能用给定数据帧的预期输出更新吗?谢谢@Ronaksah添加了预期的数据帧输出。非常感谢@Aramis7d!为了回答你的问题,仔细想想,我认为它不必排除min(日期)和max(日期)。然而,我得到了2个错误,首先我得到了“错误:找不到函数”if_else“。然后,在将下划线删除为“ifelse”之后,我得到另一个错误:-错误:replacement的长度为零。另外:警告消息:In rep(no,length.out=length(ans)):“x”为NULL,因此结果将为NULL。你有没有想过为什么我会得到这个?再次感谢。有人请解释一下[Date==min(Date)]中的“min”和[Date==max(Date)]中的“max”的用法吗?提前感谢?\u else
进入控制台会告诉您这是来自dplyr
的功能,而ifelse
来自base
R。它们的工作方式不同max
和min
返回组内参数Date
的相应最大值或最小值,我们将当前值与之进行比较。这确保我们检查ID的第一次或最后一次出现,并相应地对其进行标记。对于延迟回复@Aramis7d表示歉意。终于发现了问题所在。我的dplyr包未更新为包含“if_else”。一旦我更新了,它就工作得很好。再次感谢!