簡體   English   中英

R data.table:檢測每組內的值模式

[英]R data.table: detect pattern of values within each group

假設我有一個像這樣的 data.table:

set.seed(10)
data.table(group = rep(c("a","b","c"), each=5), date = rep(1:5,3), value = sample(c(95:105,""),15, replace=TRUE))

在每個組中,在 value 列中,我想檢查(以簡單的方式)是否有“”(空字符)或一組空字符,它們前后都有一個值。

所以,這很好:"", 95,103, etc.... (空字符在組中的第一個),但下面的模式是我想檢測的“缺失數據”示例:

95, "", 103,...(中間為空字符)

95, "","", 103...(中間幾個空字符)

95, 103, ""(最后是空字符)

所以,在下面的輸出中,我將能夠得到行/組 A,如果有很多組,我應該得到所有組(或行)

    group date value
 1:     a    1   105
 2:     a    2   103
 3:     a    3   104
 4:     a    4      
 5:     a    5   101
 6:     b    1   102
 7:     b    2   100
 8:     b    3   101
 9:     b    4    97
10:     b    5   102
11:     c    1   104
12:     c    2   101
13:     c    3   104
14:     c    4    96
15:     c    5   102

編輯:我需要做的是選擇具有錯誤模式的行(中間或最后是空字符串) ,以便能夠檢測大型數據集中是否存在任何錯誤。 因此,在我的示例中的表中,所需的輸出將是第 4 行,因為它具有“缺失值”(值之間的空字符)

     group date value
1:     a    4   

(當然,如果有更多不需要的行,我想獲取所有行)

如果您的 data.table 未根據“日期”列排序,您可以使用以下內容:

DT[order(date), order := c(1:.N) , group]
DT[value == "" & order > 1L]

輸出:

   group date value order
1:     a    4           4

數據和你的一樣:

set.seed(10)
DT <- data.table(group = rep(c("a","b","c"), each=5), date = rep(1:5,3), 
                 value = sample(c(95:105,""),15, replace=TRUE))

這是一個選項:

DT[, rw := rleid(value==""), group]
DT[value=="" & rw>1L]

輸出:

   group date value rw
1:     a    4        2

數據:

library(data.table)
set.seed(10)
DT <- data.table(group = rep(c("a","b","c","d"), each=5), 
    date = rep(1:5,4), value = c(sample(c(95:105,""),15, replace=TRUE), c("",2,3,4,5)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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