r语言 - 使用数据帧列表和向量列表并行的子集



这有效:

onion$yearone$id %in% mask$yearone

这不会:

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

为什么?缺乏在 DF 和成员 id 中的并行列中进行矢量化的明显方法(因此我仅在 DF 和成员 ID 中同时存在 id 时每年获得行),我使用 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'

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

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

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

这是一种使用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'))

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

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]))
}

最新更新