![](/img/trans.png)
[英]How to add a column with most resent recurring observation within a group, but within a certain time period, in R
[英]Position of an observation in a column within a group
我的部分數據如下:
group value
1: a 0.00000000
2: a 0.00000000
3: a -0.18586657
4: b -1.71540591
5: b 0.11086867
6: b -0.14350153
7: b 0.93055422
8: c 0.00000000
9: c 0.00000000
10: c -0.03173145
library(data.table)
DT = setDT(structure(list(group = c("a", "a", "a", "b", "b", "b", "b", "c",
"c", "c"), value = c(0, 0, -0.18586657, -1.71540591, 0.11086867,
-0.14350153, 0.93055422, 0, 0, -0.03173145)), .Names = c("group",
"value"), row.names = c(NA, -10L), class = "data.frame"))
對於每個組,我想創建一個新的虛擬變量。 如果該虛擬變量的對應值(第2列的變量)前面有兩個零,並且其自身為非零,則等於1;否則等於0。
我嘗試了很多方法,但無法解決。
您可以使用兩次shift
函數以及兩個&
來連接三個邏輯語句,然后使用by參數對group進行分組。 請注意,shift的默認值是滯后,這就是我們想要的。
df[, value2:= as.integer(value != 0 & shift(value) == 0 & shift(value, n=2) == 0), by=group]
df
group value value2
1: a 0.00000000 0
2: a 0.00000000 0
3: a -0.18586657 1
4: b -1.71540591 NA
5: b 0.11086867 0
6: b -0.14350153 0
7: b 0.93055422 0
8: c 0.00000000 0
9: c 0.00000000 0
10: c -0.03173145 1
要填充由組中第一個非零值產生的NA,您可以將結果鏈接起來。
df[, value2:= as.integer(value != 0 & shift(value) == 0 & shift(value, n=2) == 0), by=group
][is.na(value2), value2:= 0]
df
group value value2
1: a 0.00000000 0
2: a 0.00000000 0
3: a -0.18586657 1
4: b -1.71540591 0
5: b 0.11086867 0
6: b -0.14350153 0
7: b 0.93055422 0
8: c 0.00000000 0
9: c 0.00000000 0
10: c -0.03173145 1
在此,NA值的第二個鏈子集將其替換為0。
正如@Frank在評論中提到的那樣, shift
可以接受向量作為其n參數。 使用這個,而不是兩個調用一個方法shift
以上是
df[, as.integer(value != 0 & min(unlist(shift(value, n=1:2)) == 0, na.rm=TRUE)), by=group]
與先前版本不同,這不會導致NA。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.