2017-08-29 8 views
4

複数のベクトルを比較して、それらの間の値が一致する場所を確認しようとしています。私はすべての列が同じ値(一致する場合)またはNA(一致しない場合)を持つテーブルにベクトルを結合したいと思います。私は、cbind.fillをベクトルデータフレームを作り、joindplyrから、cbindmerge使用して試してみた値を照合してベクトルをデータフレームに結合する

a a a 
b NA b 
c c c 
d d NA 
NA NA e 
NA NA f 

が、すべてのそれらのいずれかを返す:

例えば:

list1 <- c("a", "b", "c", "d") 
list2 <- c("a", "c", "d") 
list3 <- c("a", "b", "c", "e", "f") 

はなった場合単一の列であるか、すべての行で値が一致しません。

Rでこの結果を得るにはどうすればよいですか?

答えて

5

Base Rソリューション:

df1 = data.frame(col = list1, list1) 
df2 = data.frame(col = list2, list2) 
df3 = data.frame(col = list3, list3) 

Reduce(function(x, y) merge(x, y, all=TRUE), list(df1, df2, df3)) 

# col list1 list2 list3 
# 1 a  a  a  a 
# 2 b  b <NA>  b 
# 3 c  c  c  c 
# 4 d  d  d <NA> 
# 5 e <NA> <NA>  e 
# 6 f <NA> <NA>  f 

結果:

> Reduce(function(x, y) merge(x, y, all=TRUE), list(df1, df2, df3))[,-1] 
    list1 list2 list3 
1  a  a  a 
2  b <NA>  b 
3  c  c  c 
4  d  d <NA> 
5 <NA> <NA>  e 
6 <NA> <NA>  f 

またはpurrr + dplyrと:

library(dplyr) 
library(purrr) 

list(list1, list2, list3) %>% 
    map(~ data.frame(col = ., ., stringsAsFactors = FALSE)) %>% 
    reduce(full_join, by = "col") %>% 
    select(-col) %>% 
    setNames(paste0("list", 1:3)) 

データ:

list1 <- c("a", "b", "c", "d") 
list2 <- c("a", "c", "d") 
list3 <- c("a", "b", "c", "e", "f") 
+0

ジャスト[-1] ''を追加あなたの関数の最後で。 – Masoud

+0

@Masoudおかげさまで、「Reduce」が実際に何をしているのかを明確にしたい – useR

5

unlistuniqueを使用してすべての値を取得し、それぞれのベクトルに一致するものを見つけることができます。何も一致しない場合、match戻ってあなたのようなNAが欲しい:

list1 <- c("a", "b", "c", "d") 
list2 <- c("a", "c", "d") 
list3 <- c("a", "b", "c", "e", "f") 
list_of_lists <- list(
    list1 = list1, 
    list2 = list2, 
    list3 = list3 
) 

all_values <- unique(unlist(list_of_lists)) 

fleshed_out <- vapply(
    list_of_lists, 
    FUN.VALUE = all_values, 
    FUN  = function(x) { 
    x[match(all_values, x)] 
    } 
) 

fleshed_out 
# list1 list2 list3 
# [1,] "a" "a" "a" 
# [2,] "b" NA "b" 
# [3,] "c" "c" "c" 
# [4,] "d" "d" NA 
# [5,] NA NA "e" 
# [6,] NA NA "f" 
関連する問題