我有以下数据框(df):
A B T Required col (window = 3)
1 1 0 1
2 3 0 3
3 4 0 4
4 2 1 1 4
5 6 0 0 2
6 4 1 1 0
7 7 1 1 1
8 8 1 1 1
9 1 0 0 1
我想添加所需的列,如下所示:
在当前行中插入 A
或 B
的上一行值。
如果在最后 3
(window
)行中,大多数情况下 A
列的内容等于 T
列- 选择A
,否则 - B
。 (可以有更多列 - 因此将选择次数最多等于 T 的列的内容)。
对于大数据表来说,最有效的方法是什么。
最佳答案
我将名为 T
的列更改为 TC
,以避免与作为 TRUE
缩写的 T
混淆>
library(tidyverse)
library(data.table)
df[, newcol := {
equal <- A == TC
map(1:.N, ~ if(.x <= 3) NA
else if(sum(equal[.x - 1:3]) > 3/2) A[.x - 1]
else B[.x - 1])
}]
df
# N A B TC newcol
# 1: 1 1 0 1 NA
# 2: 2 3 0 3 NA
# 3: 3 4 0 4 NA
# 4: 4 2 1 1 4
# 5: 5 6 0 0 2
# 6: 6 4 1 1 0
# 7: 7 7 1 1 1
# 8: 8 8 1 1 1
# 9: 9 1 0 0 1
这也有效,但不太清楚,而且效率可能较低
df[, newcol := shift(A == TC, 1:3) %>%
pmap_lgl(~sum(...) > 3/2) %>%
ifelse(shift(A), shift(B))]
数据:
df <- fread("
N A B TC
1 1 0 1
2 3 0 3
3 4 0 4
4 2 1 1
5 6 0 0
6 4 1 1
7 7 1 1
8 8 1 1
9 1 0 0
")
关于r - R 中滑动窗口数据框中最常见的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50531114/