【问题标题】:Extracting part of column if pattern found in a data.table如果在 data.table 中找到模式,则提取部分列
【发布时间】:2014-07-09 07:00:10
【问题描述】:

我有一个 data.table,我想把从其他列中找到的模式列的一部分放入向量中。例如我有以下data.table:

library(data.table)
df <- fread('./file')
df

        V1   V2  V3 V4 V5      V6 V7 V8 V9
   1:    0 -148 -49 -1  X     CAT  5  0 NA
   2:    1 -147 -49  5  X     FOT  12 0 NA
   3:    2 -146 -49  3  X     FAT  53 0 NA
   4:    3 -145 -48 -2  X     BYE  10 0 NA
   5:    4 -144 -48  0  X     GOO  2  0 NA

我想从 V7 中提取存在于一组模式之间的值,并将 V7 中的值放入一个向量中。

起始模式如下:

V2 == -147 & V4 == 5 & V6 == 'FOT'

结束模式如下:

V4 == -2 & V6 == 'BYE' 

如果找到这些模式,则从 V7 中提取它们之间的值。所以应该把12,53,10放入一个向量(x)中。

【问题讨论】:

  • dt[yourpattern, V7] ?

标签: r pattern-matching data.table


【解决方案1】:

我能想到的一种方法是使用which=TRUE

start = DT[V2 == -147 & V4 == 5 & V6=='FOT', which=TRUE] ## [1] 2L
end   = DT[V4 == -2 & V6=='BYE', which=TRUE] ## [2] 4L

DT[start:end, V7]
# [1] 12 53 10

请注意,如果有多个匹配项,则将返回所有索引。您可能想要选择相应的 startend 值。模式不返回任何匹配的情况也是如此。我会留给你解决这些边缘情况。

【讨论】:

    【解决方案2】:

    应该这样做:

    n <- min(which((df$V2 == -147 & df$V4 == 5 & df$V6 =='FOT') == TRUE)) #determine the start
    
    m <- max(which(df$V4 == -2 & df$V6 == 'BYE'))   #determine the end
    
    x <- df$V7[n:m]
    
    >x
    #[1] 12 53 10
    

    【讨论】:

    • 呃,这对于 data.frame 来说很好,但是 data.table 的错误使用 - 看到 df 重复了多少次让我畏缩
    • @eddi 对此感到抱歉.. 好吧,我承认我当然不是 data.table 专家。我只是想出了一个相对简单的操作,它可能与 data.frame 的工作方式相同。幸运的是,Arun 以完美的 data.table-like 方式给出了答案 :)
    • :) 哈哈;您可以通过编写 n = df[, min(which((V2 == -147 &amp; ...] 来保持您的代码基本相同并消除很多额外的 df
    • 此代码n = df[, min(which((V2 == 0 &amp; ...)))] 有时即使存在模式也会给我以下错误。 **警告消息:在 min(which((V2 == 0 & ...))) 中:max 没有非缺失参数;返回 Inf ** max 函数也是如此。我怎样才能让它正常工作?
    猜你喜欢
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多