我正在尝试根据其他列中某些数字的存在打印出一些输出。
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) ...
任何想法?
答案 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