R 变量采用新值时的ID测量
我相信我的问题有一个非常简单的解决办法。那样的话,我很抱歉。我一直试图寻找一个类似的问题,但徒劳无功。 我希望创建一个“ID”变量,R 变量采用新值时的ID测量,r,R,我相信我的问题有一个非常简单的解决办法。那样的话,我很抱歉。我一直试图寻找一个类似的问题,但徒劳无功。 我希望创建一个“ID”变量,ID3,每当ID2\u EVWIND接受一个新值时,该变量就会接受一个新值。 我的数据框的简化版本如下所示 ##1 Date ID2_EVWIND ID3 #2 8/2/02 35 1 #3 28/2/02 35 1 #4 28/2/02 35 1 #5 2/2/02 36
ID3
,每当ID2\u EVWIND
接受一个新值时,该变量就会接受一个新值。
我的数据框的简化版本如下所示
##1 Date ID2_EVWIND ID3
#2 8/2/02 35 1
#3 28/2/02 35 1
#4 28/2/02 35 1
#5 2/2/02 36 2
#6 13/2/02 36 2
#7 11/2/02 36 2
#8 8/2/02 36 2
#9 8/2/02 36 2
#10 20/2/02 25 3
#11 10/2/02 25 3
#12 21/2/02 33 4
#13 4/2/02 33 4
#14 16/2/02 33 4
#15 15/2/02 33 4
#16 16/2/02 33 4
#17 23/2/02 29 5
#18 3/2/02 30 6
#19 11/2/02 30 6
#20 26/2/02 30 6
#21 26/2/02 30 6
#22 6/2/02 18 7
#23 28/2/02 18 7
#24 6/2/02 18 7
#25 13/2/02 40 8
#26 7/2/02 40 8
#27 15/2/02 40 8
#28 17/2/02 40 8
#29 16/2/02 40 8
#30 27/2/02 24 9
#31 8/2/02 24 9
#32 3/2/02 11 10
#33 2/2/02 11 10
#34 5/2/02 11 10
#35 4/2/02 12 11
我在此提供一个R中的可复制示例,其中包含我希望创建的变量,ID3
structure(list(Date = structure(c(1013126400, 1014854400, 1014854400,
1012608000, 1013558400, 1013385600, 1013126400, 1013126400, 1014163200,
1013299200, 1014249600, 1012780800, 1013817600, 1013731200, 1013817600,
1014422400, 1012694400, 1013385600, 1014681600, 1014681600, 1012953600,
1014854400, 1012953600, 1013558400, 1013040000, 1013731200, 1013904000,
1013817600, 1014768000, 1013126400, 1012694400, 1012608000, 1012867200,
1012780800), class = c("POSIXct", "POSIXt"), tzone = "UTC"),
ID2_EVWIND = c(35, 35, 35, 36, 36, 36, 36, 36, 25, 25, 33,
33, 33, 33, 33, 29, 30, 30, 30, 30, 18, 18, 18, 40, 40, 40,
40, 40, 24, 24, 11, 11, 11, 12)), row.names = c(NA, -34L), class = c("tbl_df",
"tbl", "data.frame"))
提前感谢(!)您可以使用
数据。表rleid
:
data.table::rleid(df$ID2_EVWIND)
#[1] 1 1 1 2 2 2 2 2 3 3 4 4 4 4 4 5 6 6 6 6 7 7 7 8 8 8 8 8 9 9 10 10 10 11
另一个选项是匹配
:
match(df$ID2_EVWIND, unique(df$ID2_EVWIND))
虽然在这种情况下,它们都给出了预期的输出,但当数字重复时,它们的行为是不同的。举个例子:
x <- c(1, 1, 2, 3, 3, 1, 1)
data.table::rleid(x)
#[1] 1 1 2 3 3 4 4
match(x, unique(x))
#[1] 1 1 2 3 3 1 1
x和使用dplyr::lag
的方法:
library(dplyr)
d %>%
mutate(ID3 = cumsum(ID2_EVWIND != lag(ID2_EVWIND, default = 0)))
#> # A tibble: 34 x 3
#> Date ID2_EVWIND ID3
#> <dttm> <dbl> <int>
#> 1 2002-02-08 00:00:00 35 1
#> 2 2002-02-28 00:00:00 35 1
#> 3 2002-02-28 00:00:00 35 1
#> 4 2002-02-02 00:00:00 36 2
#> 5 2002-02-13 00:00:00 36 2
#> 6 2002-02-11 00:00:00 36 2
#> 7 2002-02-08 00:00:00 36 2
#> 8 2002-02-08 00:00:00 36 2
#> 9 2002-02-20 00:00:00 25 3
#> 10 2002-02-10 00:00:00 25 3
#> # ... with 24 more rows
库(dplyr)
d%>%
突变(ID3=cumsum(ID2_-EVWIND!=lag(ID2_-EVWIND,默认值=0)))
#>#A tibble:34 x 3
#>日期ID2\u EVWIND ID3
#>
#> 1 2002-02-08 00:00:00 35 1
#> 2 2002-02-28 00:00:00 35 1
#> 3 2002-02-28 00:00:00 35 1
#> 4 2002-02-02 00:00:00 36 2
#> 5 2002-02-13 00:00:00 36 2
#> 6 2002-02-11 00:00:00 36 2
#> 7 2002-02-08 00:00:00 36 2
#> 8 2002-02-08 00:00:00 36 2
#> 9 2002-02-20 00:00:00 25 3
#> 10 2002-02-10 00:00:00 25 3
#> # ... 还有24行
使用diff
使用dplyr
:
库(dplyr)
df%>%
突变(ID3=cumsum(c(1,abs(diff(ID2_EVWIND))>0)))%>
总目()
#>#tibble:6 x 3
#>日期ID2\u EVWIND ID3
#>
#> 1 2002-02-08 00:00:00 35 1
#> 2 2002-02-28 00:00:00 35 1
#> 3 2002-02-28 00:00:00 35 1
#> 4 2002-02-02 00:00:00 36 2
#> 5 2002-02-13 00:00:00 36 2
#> 6 2002-02-11 00:00:00 36 2
和基本r版本:
df$ID3 <- cumsum(c(1, abs(diff(df$ID2_EVWIND)) > 0))
head(df)
#> # A tibble: 6 x 3
#> Date ID2_EVWIND ID3
#> <dttm> <dbl> <dbl>
#> 1 2002-02-08 00:00:00 35 1
#> 2 2002-02-28 00:00:00 35 1
#> 3 2002-02-28 00:00:00 35 1
#> 4 2002-02-02 00:00:00 36 2
#> 5 2002-02-13 00:00:00 36 2
#> 6 2002-02-11 00:00:00 36 2
df$ID3(0))
头部(df)
#>#tibble:6 x 3
#>日期ID2\u EVWIND ID3
#>
#> 1 2002-02-08 00:00:00 35 1
#> 2 2002-02-28 00:00:00 35 1
#> 3 2002-02-28 00:00:00 35 1
#> 4 2002-02-02 00:00:00 36 2
#> 5 2002-02-13 00:00:00 36 2
#> 6 2002-02-11 00:00:00 36 2
由(v0.3.0)于2020年7月11日创建