R -多个 Dataframe 之间的元素模式

qyzbxkaa  于 2023-05-26  发布在  其他
关注(0)|答案(1)|浏览(242)

我在一个列表中得到了多个相同维度的 Dataframe 。所有 Dataframe 都是分类的,每个都有factorlevels。 Dataframe 的列名是相同的,通常它们具有相同的factorlevels。可能有些因子水平并不出现在所有 Dataframe 中。我需要创建一个dataframe,其中每个元素都是所有dataframe中此位置所有元素的模式(最频繁出现的元素)。如果有一个最常见的领带,那么就采取其中之一,无论是第一个,最后一个或随机一个。
这就是数据的样子,例如。df1df2df3df4存储在列表df <- list(df1,df2,df3,df4)

df1
  col1 col2  col3
1    e    6 FALSE
2    b    1 FALSE
3    d    1  TRUE
4    e    2  TRUE
5    d    5  TRUE
> df2
  col1 col2  col3
1    b    2 FALSE
2    f    0  TRUE
3    e    5 FALSE
4    e    1  TRUE
5    b    1 FALSE
> df3
  col1 col2  col3
1    r    0  TRUE
2    d    1  TRUE
3    d    0 FALSE
4    b    5  TRUE
5    e    2  TRUE
> df4
  col1 col2  col3
1    d    5  TRUE
2    e    1  TRUE
3    b    2 FALSE
4    d    0  TRUE
5    e    5  TRUE

理想的结果是这样的。希望没有弄错,这是手工完成的。

col1 col2  col3
1    e    6 FALSE
2    b    1  TRUE
3    d    1  FALSE
4    e    2  TRUE
5    e    5  TRUE

可以使用以下代码重新创建给定的数据:

df1 = data.frame(col1 = c("e", "b", "d", "e", "d") ,
                 col2 = c(6, 1, 1, 2, 5),
                 col3= c(FALSE, FALSE, TRUE,TRUE, TRUE))
df1 <- data.frame(lapply(df1,factor))

df2 = data.frame(col1 = c("b", "f", "e", "e", "b") ,
                 col2 = c(2, 0, 5, 1, 1),
                 col3= c(FALSE, TRUE, FALSE,TRUE, FALSE))
df2 <- data.frame(lapply(df2,factor))

df3 = data.frame(col1 = c("r", "d", "d", "b", "e") ,
                 col2 = c(0, 1, 0, 5, 2),
                 col3= c(TRUE, TRUE, FALSE,TRUE, TRUE))
df3 <- data.frame(lapply(df3,factor))

df4 = data.frame(col1 = c("d", "e", "b", "d", "e") ,
                 col2 = c(5, 1, 2, 0, 5),
                 col3= c(TRUE, TRUE, FALSE,TRUE, TRUE))
df4 <- data.frame(lapply(df4,factor))

df <- list(df1,df2,df3,df4)

非常感谢您的帮助!

yqyhoc1h

yqyhoc1h1#

您可以在每个列表中添加一个位置列,将它们组合成一个 Dataframe ,并为每个位置查找Mode

library(dplyr)
library(purrr)

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

map_df(df, ~.x %>% mutate(position = row_number())) %>%
  summarise(across(everything(), Mode), .by = position) %>%
  select(-position)

#  col1 col2  col3
#1    e    6 FALSE
#2    b    1  TRUE
#3    d    1 FALSE
#4    e    2  TRUE
#5    e    5  TRUE

相关问题