簡體   English   中英

觀測值在組內列中的位置

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM