R 使用数据帧列表和向量列表并行生成子集
这项工作:R 使用数据帧列表和向量列表并行生成子集,r,dataframe,vectorization,subset,R,Dataframe,Vectorization,Subset,这项工作: onion$yearone$id %in% mask$yearone 这并不是: onion[1][1] %in% mask[1] onion[1]['id'] %in% mask[1] 为什么??在DF和memberids中没有一种明显的并行列矢量化方法(因此,当DF和memberids中都有id时,我每年只能得到行),我使用for循环,但我没有幸运地找到正确的方法来表示索引。。。帮忙 示例数据: yearone <- data.frame(id=c("b","b","c
onion$yearone$id %in% mask$yearone
这并不是:
onion[1][1] %in% mask[1]
onion[1]['id'] %in% mask[1]
为什么??在DF和memberids中没有一种明显的并行列矢量化方法(因此,当DF和memberids中都有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“$”运算符与“[”运算符不同。如果“yearone”和“id”实际上是这些列表中的第一项,那么您应该看到这与第一次调用的结果相同:
DF[[1]][[1]] %in% memberids[[1]]
为什么我们认为访问yearpathall
应该得到相同的结果,目前还不清楚,但是使用“[[”操作符可能会得到一个原子向量,而使用“[”肯定不会[“运算符始终返回与其第一个参数相同的类的结果,因此在本例中,对于'DF'和'memberId',都是一个列表而不是一个向量。%in%运算符只是一个中缀版本的匹配
,并且需要一个原子向量,因为它的两个参数的“$”运算符与'['运算符。如果“yearone”和“id”实际上是这些列表中的第一项,那么您应该看到这与第一次调用的结果相同:
DF[[1]][[1]] %in% memberids[[1]]
为什么我们认为访问yearpathall
应该得到相同的结果,目前还不清楚,但是使用“[[”操作符可能会得到一个原子向量,而使用“[”肯定不会[“运算符总是返回与其第一个参数相同的类的结果,因此在本例中,对于'DF'和'memberId',都是一个列表而不是一个向量。%in%运算符只是匹配的中缀版本,并且需要一个原子向量作为其两个参数这似乎是我所寻求的答案:
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]))
}
result这似乎是我想要的答案:
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]))
}
result这里是一种使用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))
#一些数据
洋葱这里有一种使用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))
#一些数据
这里有一个可复制的示例,包括您的数据结构(dput(DT)
或类似结构)将有所帮助。[
的工作方式取决于对象的类别(data.frame
,matrix
,vector
)。读取?[
!请注意,您有一个data.frames列表和一个原子向量列表,因此标题有点误导性(或者您需要将mask[[1]]
更改为data.frames(mask_id=c('a','c'))
或者类似的东西是的,在这个例子中,我有一个数据帧和一个原子列表,但在我的实际数据中,我有一个用于许多财政年度的数据。好吧,你必须调整我的答案以允许这一点……我指的是一个包含许多数据帧的列表和一个包含许多原子向量的列表。你的答案很好,谢谢!:7)一个可复制的示例,包括您的数据结构(dput(DT)
或类似)将在这里有所帮助。[
的工作方式取决于对象的类别(data.frame
,matrix
,vector
)。读取?[
!请注意,您有一个data.frames列表和一个原子向量列表,因此标题有点误导性(或者您需要将mask[[1]]
更改为data.frames(mask_id=c('a','c'))
或者类似的东西是的,在这个例子中,我有一个数据帧和一个原子列表,但在我的实际数据中,我有一个用于许多财政年度的数据。好吧,你必须调整我的答案以允许这一点……我指的是一个包含许多数据帧的列表和一个包含许多原子向量的列表。你的答案很好,谢谢!:7)为了清晰起见,我刚刚更改了变量名,但您的代码在%mask[[1]]中确实可以作为洋葱[[1]]]%使用。为了清晰起见,我刚刚更改了变量名,但您的代码在%mask[[1]]中确实可以作为洋葱[[1]]%使用