获取所有列中连续的每四个4值的模式,并作为r中的一行插入另一个矩阵

时间:2017-06-20 16:06:34

标签: r

我有一个96行和42372列的矩阵。

我应该在所有列中采用前4行的模式,并将其作为第一行转储到另一个矩阵中。

然后在所有列中采用接下来四行的模式,并将其作为第二行转储到另一个矩阵中。

等等。

新矩阵将包含24行和42372列。

我写了一个函数如下;的 SOURCE: Is there a built-in function for finding the mode?

GetMode <- function(x)

 {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

输出是第一个矩阵。 (96行和42372列)

Output2是新矩阵。 (24行和42372列)

我现在正在尝试

output2[1,]<-GetMode(output[1:4,])

但它是所有列中每行的打印模式,并将其作为新行打印。

2 个答案:

答案 0 :(得分:0)

试一试并告诉我它是否适合你:

# Fake Data
output <- matrix(round(runif(96*42372, 1, 40)), nrow = 96, ncol = 42372)

# https://stackoverflow.com/questions/2547402/is-there-a-built-in-function-for-finding-the-mode
GetMode <- function(x){
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

every = 4
output2 <- output; output2[] <- NA
output2 <- sapply(seq(from = 1, to = nrow(output), by = every), 
                      function(i) apply(output[i:(i+(every-1)),], 2, GetMode))

dim(output2)
output2[1:6,1:6]

答案 1 :(得分:0)

您可以使用data.table包:

library(data.table)
#df0 is the original *"data.frame"*
df1 <- cbind(rep(1:(96/4), each=4), df0) #Add a column for grouping
colnames(df1)[1] <- "id"                 #Make the col name clean

df1 <- data.table(df1)                   #Convert to data table

df.mode <- df1[,GetMode(.SD),id]         #Get the mode for each group and all columns

<强> 数据:

df0 <- matrix(rep(1:24000, each = 4), nrow = 96, ncol = 100)
df0 <- data.frame(df0)

<强> 功能:

GetMode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}