我有一个像这样的大数据框:
df = read.table(text="POS m1 m2 m3 m4 m5 m6 m7 m8
16617 B B H H H H B H
16625 B B H H H H B H
16666 B B H H H B B H
16828 B B H H H B B A
19429 B B H A B B B A
66665 B A H A B B B A
67144 B A H A B B B A
67238 B A H A B B B H
67772 B A H A H B B H
67881 B A H A H B B H
68128 B A H A H B B H
69120 A A B H H B B H", header=T, stringsAsFactors=F)
第一列用于对行进行排序。其余列仅包含三个元素或值(A、B 或 H)。我想要一个滑动窗口(例如五行大小,以两行为一步)通过从滑动窗口中获取大部分元素,将数据聚合到每个滑动窗口中的一行。预期结果如下所示:
POS m1 m2 m3 m4 m5 m6 m7 m8
16617 B B H H H B B H
16666 B B H A B B B A
19429 B A H A B B B A
67144 B A H A H B B H
67772 B A H A H B B H
我希望有人能帮我解决这个问题。谢谢。
您可以使用
zoo::rollapply
在滑动窗口上应用函数(此处为模式,取自 collapse
)。宽度为 5,并且 partial = TRUE
允许部分计算。您可以使用 by
计算每 n 行的 FUN
:
by 在每个第一个时间点而不是每个点计算 FUN。 仅当宽度为长度 1 并且是普通标量或 列表。
library(zoo)
library(collapse)
rollapply(df[-1], FUN = fmode, width = 5, partial = TRUE, by = 2) |>
cbind(df[1])
# m1 m2 m3 m4 m5 m6 m7 m8 POS
# 1 B B H H H H B H 16617
# 2 B B H H H B B H 16625
# 3 B B H A B B B A 16666
# 4 B A H A B B B A 16828
# 5 B A H A H B B H 19429
# 6 B A H A H B B H 66665
# 7 B B H H H H B H 67144
# 8 B B H H H B B H 67238
# 9 B B H A B B B A 67772
# 10 B A H A B B B A 67881
# 11 B A H A H B B H 68128
# 12 B A H A H B B H 69120
你可以像这样增长
seq
长度n
和步数s
和table
的影响:
n <- 5; s <- 2
t(sapply(seq.int(0, dim(df)[1] - n + 1L, s), \(x, y)
sapply(df[x + y, -1], \(z) names(which.max(table(z)))), 1:n)) |>
`rownames<-`(`length<-`(df$POS[seq_along(df$POS) %% 2 == 1], n))
# m1 m2 m3 m4 m5 m6 m7 m8
# 16617 "B" "B" "H" "H" "H" "B" "B" "H"
# 16666 "B" "B" "H" "A" "B" "B" "B" "A"
# 19429 "B" "A" "H" "A" "B" "B" "B" "A"
# 67144 "B" "A" "H" "A" "H" "B" "B" "H"
# 67772 "B" "A" "H" "A" "H" "B" "B" "H"
如果您不喜欢该矩阵,请将其通过管道输入
|> as.data.frame()
。
数据:
df <- structure(list(POS = c(16617L, 16625L, 16666L, 16828L, 19429L,
66665L, 67144L, 67238L, 67772L, 67881L, 68128L, 69120L), m1 = c("B",
"B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "A"), m2 = c("B",
"B", "B", "B", "B", "A", "A", "A", "A", "A", "A", "A"), m3 = c("H",
"H", "H", "H", "H", "H", "H", "H", "H", "H", "H", "B"), m4 = c("H",
"H", "H", "H", "A", "A", "A", "A", "A", "A", "A", "H"), m5 = c("H",
"H", "H", "H", "B", "B", "B", "B", "H", "H", "H", "H"), m6 = c("H",
"H", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B"), m7 = c("B",
"B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B"), m8 = c("H",
"H", "H", "A", "A", "A", "A", "H", "H", "H", "H", "H")), class = "data.frame", row.names = c(NA,
-12L))