【问题标题】:Submit every similarly named elements of a list of vectors to a function in R将向量列表中每个类似命名的元素提交给 R 中的函数
【发布时间】:2020-11-08 23:31:45
【问题描述】:

下面,我想知道如何在L 中分别 使用BASE R 函数quantile() 中名为EFLESL 的元素?

注意:这是一个玩具示例,L 可以包含任意数量的类似名称的元素。

foo <- function(X) {
  X <- as.matrix(X)
  tab <- table(row(X), factor(X, levels = sort(unique(as.vector(X)))))
  w <- diag(ncol(tab))
  rosum <- rowSums(tab)
  obs_oc <- tab * (t(w %*% t(tab)) - 1)
  obs_c <- colSums(obs_oc)
  max_oc <- tab * (rosum - 1)
  max_c <- colSums(max_oc)
  SA <- obs_c / max_c
  h <- names(SA)
  h[is.na(h)] <- "NA"
  setNames(SA, h)
}  

DAT <- read.csv("https://raw.githubusercontent.com/rnorouzian/m/master/X.csv", row.names = 1)
L <- replicate(50, foo(DAT[sample(1:nrow(DAT), replace = TRUE),]), simplify = FALSE)

# How to use `quantile()` separately across all similarly named elements (e.g., EFL, ESL) in `L[[i]]` i = 1,... 5

# quantile(all EFL elements across `L`)
# quantile(all ESL elements across `L`)

【问题讨论】:

  • 这个怎么样? sapply(as.data.frame(do.call(rbind, L)), quantile)

标签: r loops dataframe lapply


【解决方案1】:

之前的解决方案我使用do.callrbind 将每个列表转换为矩阵和数组,然后计算每个data.frame 行的分位数。

sapply(as.data.frame(do.call(rbind, L)), quantile)

但是,当缺少行时,它不会考虑到这一点。要准确获取行,您需要填充缺失的行。我使用data.tablerbindlist(你也可以使用plyr::rbind.fill)和fill=TRUE 来填充缺失值。它要求每个都是 data.frame/table/list,所以我将每个转换为 data.frame,但在这样做之前,您需要转置 (t()) 数据,以便行与每个元素对齐。它可以写在一行中,但更容易阅读多行中发生的事情。

L2 = lapply(L, function(x){as.data.frame(t(x))})
df = data.table::rbindlist(L2, fill=TRUE) # or plyr::rbind.fill(L2)
sapply(df, quantile, na.rm = TRUE)

【讨论】:

    【解决方案2】:

    你也可以使用purrr::transpose:

    Lt <- purrr::tranpose(L)
    quantile(unlist(Lt$EFL),.8)
    quantile(unlist(Lt$ESL),.8)
    

    【讨论】:

    • 可能你被否决了,因为你的代码抛出错误。 Error: 'tranpose' is not an exported object from 'namespace:purrr'
    • @reza,我不知道,transpose belongs to purrr。也许最好坚持使用基础 R...
    • 我在您的代码中看到了拼写错误 tranpose 而不是 transpose。此外,可以使用purrr::transpose(L) %&gt;% map_dbl(~ flatten_dbl(.x) %&gt;% quantile(probs = 0.8))# EFL ESL 0.8888889 0.0000000 进行修改
    • 谢谢@akrun!我太快了,没有测试足够......
    猜你喜欢
    • 2019-12-14
    • 2018-09-25
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 2021-10-21
    相关资源
    最近更新 更多