如果data.table中满足多个条件,则打印输出

时间:2014-04-07 23:27:55

标签: r data.table

我正在尝试根据其他列中某些数字的存在打印出一些输出。

1)如果列V4 中存在 0 的值,如果列V8的值大于30,则

2)然后打印该行和它下面的2行

3)但仅当时,对于值为0的行,满足上述三行的相同条件。

我可以执行第1步和第2步,但是我在执行第3步时遇到了问题。这是输入:

> library(data.table)
> file
      V1   V2  V3 V4 V5      V6 V7 V8
 1:    0 -232 -77 -1  D     dog  0  0
 2:    1 -231 -77  0  C     cat  0  40
 3:    2 -230 -77  1  T     tai  0  0
 4:    3 -229 -76 -1  F     fis  0  0
 5:    4 -228 -76  0  G     goo  0  100
---                                  
1162: 1161  929 310 -1  S     soo  0  0
1163: 1162  930 310  0  B     bye  0  0
1164: 1163  931 310  1  G     goo  0  0
1165: 1164  932 311 -1  T     tuu  0  0
1166: 1165  933 311  0  R     roo  0  50

如果我然后运行以下代码,我会得到一个接近但不完全正确的输出。

#grouping data table into groups of 3
file[, grp := rep(seq_len(round(ceiling(.N/3))), each = 3,length.out=.N)]
file = file[, if(.N == 3 && V4==0) .SD, by = grp]

#generating the output formatted in the way I want
out <- file[, if(V4 == 0 && V8 > 30) c(V1[1], V1[3], V2[1], V2[3], as.list(V4), as.list(V5), as.list(V6), as.list(V8)), by=grp] 

在此步骤(见下文)中,我想添加一个标准,仅生成输出如果列V4 = 0,同一行的V8列大于30 如果第8列中的值>> 30,则上面有三行。

file[, if(V4 == 0 && V8 > 30) ...

任何想法?

1 个答案:

答案 0 :(得分:1)

我会通过三步法实现这一点:

df <- read.table(textConnection("
V1   V2  V3 V4 V5      V6 V7 V8
 0 -232 -77 -1  D     dog  0  0
 1 -231 -77  0  C     cat  0  40
 2 -230 -77  1  T     tai  0  0
 3 -229 -76 -1  F     fis  0  0
 4 -228 -76  0  G     goo  0  100
 1161  929 310 -1  S     soo  0  0
 1162  930 310  0  B     bye  0  0"), header=TRUE)

# condition 1
a <- df$V4 == 0 & df$V8 > 30

# condition 3 (does the row 3 rows above fulfill condition 1?)
aIdx <- which(a)
b <- (aIdx-3) %in% aIdx
a[a] <- b

# condition 2 (select also the next two rows)
i <- rep(which(a), 3) + 0:2
a[i] <- TRUE

df[a, ]
#     V1   V2  V3 V4 V5  V6 V7  V8
# 5    4 -228 -76  0  G goo  0 100
# 6 1161  929 310 -1  S soo  0   0
# 7 1162  930 310  0  B bye  0   0