0

これは機能します:

onion$yearone$id %in% mask$yearone

これはしません:

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

なんで?DFとメンバーIDの並列列をベクトル化する明白な方法を除いて(IDがDFとメンバー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'
4

3 に答える 3

3

'$'演算子は'['演算子と同じではありません。「yearone」と「ids」が実際にこれらのリストの最初の項目である場合、これが最初の呼び出しと同じ結果をもたらすことがわかります。

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

アクセスすると同じ結果が得られると考える理由はyearpathall現時点では完全に不明ですが、「[[」演算子を使用するとアトミックベクトルが得られる可能性がありますが、「[」を使用すると得られないことは確かです。「[」演算子は常に最初の引数と同じクラスの結果を返すため、この場合、「DF」と「memberids」の両方について、ベクトルではなくリストになります。%in%演算子は、中置バージョンfomatchであり、両方の引数としてアトミックベクトルが必要です。

于 2012-09-27T07:30:59.150 に答える
1

ここに使用するアプローチがあります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'))
于 2012-09-27T23:59:23.460 に答える
0

これは私が求めていた答えのようです:

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]))
}
于 2012-09-27T23:17:33.013 に答える