【问题标题】:R data.table: detect pattern of values within each groupR data.table:检测每组内的值模式
【发布时间】:2020-07-12 14:11:25
【问题描述】:

假设我有一个这样的 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))

在每个组中,在值列中,我想检查(简单地说)是否有一个“”(空字符)或一组空字符,它前面和后面都有一个值.

所以,这很好:“”、95,103 等......(空字符在组中的第一个),但下面的模式是 我想检测的示例“缺失数据”:

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   

(如果有更多不需要的行,我当然希望全部获得)

【问题讨论】:

  • 您的数据中没有""
  • 您想要的输出是什么,符合条件的行还是不符合条件的行?
  • @Edward 这样做的(例如,我想检查大型数据集中是否存在间隙,理想情况下应该为零)
  • @arg0naut91 第 4 行?否则只需使用不同的种子号...

标签: r database string data.table pattern-matching


【解决方案1】:

如果您的 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))

【讨论】:

  • 我不认为这会在一个组中有多个行开头有一个空字符串(例如,第 1、第 2 和第 3 有一个空字符串)的情况下起作用?
  • 它会起作用的。您可以使用以下示例进行测试:DT &lt;- data.table(group = rep(c("a","b"), each=3), date = c(1,2,3), value = c("","","","95","","100"))
  • 答案基本上返回所有具有空字符串的行作为'value',除了每个组的第一个日期。
【解决方案2】:

这是一个选项:

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)))

【讨论】:

  • 谢谢,但我会做的是选择具有错误模式的行(所以中间的空字符串/字符串),以便能够检测是否有任何错误一个大型数据集。
  • 你能发布你想要的输出吗?
  • 在您创建的 DT 中,它将是: 1: c 5 (DT 表的第 15 行,其中有一个空字符串作为组内的最后一个值)。在我的示例表中,它将是第 4 行,因为它在值之间有一个空字符
  • post 就像在您的帖子中输入所需的输出一样,因为措辞非常模糊。
  • 也更新了我的帖子。上一个是因为基于我可以得到行/组A,如果有很多组,我应该得到所有组(或行),看起来你想要整个组
猜你喜欢
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多