如何通过沿行滑动窗口来聚合大数据框

问题描述 投票:0回答:2

我有一个像这样的大数据框:

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

我希望有人能帮我解决这个问题。谢谢。

r dataframe aggregate
2个回答
1
投票

您可以使用

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

0
投票

你可以像这样增长

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))
© www.soinside.com 2019 - 2024. All rights reserved.