【问题标题】:subset in parallel using a list of dataframes and a list of vectors使用数据帧列表和向量列表并行子集
【发布时间】:2012-09-27 06:32:57
【问题描述】:

这行得通:

onion$yearone$id %in% mask$yearone

这不是:

onion[1][1] %in% mask[1]
onion[1]['id'] %in% mask[1]

为什么?缺乏一种在 DF 和 memberids 中的并行列中矢量化的明显方法(所以当 DF 和 memberids 中都存在 ids 时,我每年只得到行),我使用 for 循环,但我没有幸运地找到表示索引的正确方法...帮助?

示例数据:

yearone <- data.frame(id=c("b","b","c","a","a"),v=rnorm(5))
onion <- list()
onion[[1]] <- yearone
names(onion) <- 'yearone'
mask <- list()
mask[[1]] <- c('a','c')
names(mask) <- 'yearone'

【问题讨论】:

  • 一个可重现的示例,包括您的数据结构(dput(DT) 或类似的)将在这里有所帮助。 [ 的工作方式取决于对象的类(data.framematrixvector)。阅读?[
  • 请注意,您有 1 个 data.frames 列表和 1 个原子向量列表,因此标题有点误导(或者您需要将 mask[[1]] 更改为 data.frame(mask_id = c('a','c')) 或类似的东西
  • 是的,在这个例子中我有一个数据框和一个原子列表,但在我的真实数据中,我有一个用于许多财政年度的数据。
  • 好吧,你必须调整我的答案才能允许这个.....
  • 我的意思是许多数据帧的列表和许多原子向量的列表。你的回答很好用,谢谢! :7)

标签: r dataframe vectorization subset


【解决方案1】:

“$”运算符与“[”运算符不同。如果“yearone”和“ids”实际上是这些列表中的第一项,您应该看到这与第一次调用的结果相同:

DF[[1]][[1]] %in% memberids[[1]]

为什么我们应该认为访问yearpathall 应该给出相同的结果目前完全不清楚,但是使用“[[”运算符可能会给出一个原子向量,而使用“[”肯定不会。 "[" 运算符总是返回与其第一个参数相同的类的结果,因此在这种情况下,对于 'DF' 和 'memberids' 来说,它将是一个列表而不是一个向量。 %in% 运算符只是 match 的中缀版本,需要一个原子向量作为它的两个参数

【讨论】:

  • 为了清楚起见,我只是更改了变量名,但您的代码确实可以作为 onion[[1]][[1]] %in% mask[[1]]
【解决方案2】:

这是一种使用Map的方法

# some data
onion <- replicate(5,data.frame(id = sample(letters[1:3], 5,T), v = 1:5), 
                   simplify = F)
mask <- replicate(5, sample(letters[1:3],2), simplify = F)
names(onion) <- names(mask) <- paste0('year', seq_along(onion))

进行匹配的函数

get_matches <- function(data, id, mask){
   rows <- data[[id]] %in% mask
   data[rows,]
}


Map(get_matches , data = onion, mask = mask, MoreArgs = list(id = 'id'))

【讨论】:

    【解决方案3】:

    这似乎是我正在寻找的答案:

    merge(mask[1],onion[[1]], by.x = names(mask[1]), by.y = names(onion[[1]][1]))
    

    并应用于数据帧的并行列表:

    result <- list()
    for (i in 1:(length(names(onion)))) {
      result[[i]] <- merge(mask[i],onion[[i]], by.x = names(mask[i]), by.y = names(onion[[i]][1]))
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-23
      • 2022-06-16
      • 2018-08-31
      • 1970-01-01
      • 2021-05-22
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多