我想为列表元素中的每组 Dataframe 找到一个模式,并将结果写入新列

zxlwwiss  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(106)

我有一个名为“data”的列表,它由10个元素(列表)组成,每个元素(列表)有不同数量的元素,例如

lengths(data)

[1]26 33 3 20 22 21 17 18
因此,我们列表的第一个元素由26个元素组成,第二个元素由33个元素组成,以此类推...例如,这些元素中的每一个都是 Dataframe (“tibbles”),具有6列(前四个是整数,第五个是逻辑,最后一个是字符

colnames(data[[1]][[1]])

[1]“宽度”“高度”“x”“y”“空格”“文本”
尽管 Dataframe (列)的结构在组内外是一致的,但即使在组内,每个 Dataframe 的行数也不同。
我想为同一元素中分组的 Dataframe 找到一个模式“高度”。
因此,第一个元素中的26个 Dataframe 有共同的模式,以此类推。换句话说,我想将第一个元素中的26个 Dataframe 的数据分组,计算模式,然后将结果作为新列写入每个 Dataframe ,以便我可以对高度高于、低于和等于模式的行执行不同的操作。

这是我到目前为止得出的结论,尽管它不正确,但在大多数情况下应该会产生相同的结果:

getmode <- function(v) {
  uniqv <- unique(v)
  uniqv[which.max(tabulate(match(v, uniqv)))]
}

mode <- lapply(data, function(x) lapply(lapply(x, '[[', 
           'height'), getmode)) # find    mode height for each
                                # paper and each page
mode2 <- lapply(mode, function (x) getmode(x)) 
                          # find mode for each paper
huus2vyu

huus2vyu1#

这里有一个选项,我们使用map循环外部列表,然后使用bind_rows(来自dplyr)将内部列表元素绑定到单个数据,创建列grp,将getmode应用于组合的“height”列以创建新列,然后按“grp”列拆分数据集

library(purrr)
library(dplyr)
map(data, ~ bind_rows(.x, .id = 'grp') %>% 
    mutate(Mode = getmode(height)) %>%
    group_split(grp, .keep = FALSE))

或者用lapply循环list,用sapply循环内部列表,从各个内部列表元素中提取“height”,应用getmode并返回一个模式值向量,在该向量上再次应用getmode

lapply(data, function(x) {
   mode <- getmode(sapply(x, function(y) getmode(y$height)))
   lapply(x, function(y) cbind(y, mode))
 })

数据

set.seed(24)
 data1 <- replicate(26, head(mtcars) %>% mutate(height = rnorm(6)), simplify = FALSE)
 data2 <- replicate(33, head(iris) %>% mutate(height = rnorm(6)), simplify = FALSE)
 data <- list(data1, data2)

相关问题