2017-01-10 2 views
-1

У меня есть следующие кадры данных:Маркировка dataframe пересечений на основе уникального списка значений [R]

df1 (исходные данные)

X | Y | Z | 
apple | rest | town | 
town | map | guide | 
rest | full | down | 

df2 (имена же столбец, но добавили уникальные значения на левом

uniquevalue | X | Y | Z | 
apple  | 0 | 0 | 0 | 
rest  | 0 | 0 | 0 | 
town  | 0 | 0 | 0 | 
map   | 0 | 0 | 0 | 
guide  | 0 | 0 | 0 | 
full  | 0 | 0 | 0 | 
down  | 0 | 0 | 0 | 

И я хочу создать следующий, где каждая комбинация проверяется 1, если пересечение есть из исходных данных.

uniquevalue | X | Y | Z | 
apple  | 1 | 0 | 0 | 
rest  | 1 | 1 | 0 | 
town  | 1 | 0 | 1 | 
map   | 0 | 1 | 0 | 
guide  | 0 | 0 | 1 | 
full  | 0 | 1 | 0 | 
down  | 0 | 0 | 1 | 

ответ

2

Использование is.element, что то же самое, используя %in%:

unqval <- unique(unlist(df1)) 
data.frame(unqval, sapply(df1, is.element, el=unqval)+0) 
# unqval X Y Z 
#1 apple 1 0 0 
#2 town 1 0 1 
#3 rest 1 1 0 
#4 map 0 1 0 
#5 full 0 1 0 
#6 guide 0 0 1 
#7 down 0 0 1 
1

Это может установить рекорд для уродливых SO ответ когда-либо, но здесь идет ...

df1 <- read.table(text = "X|Y| Z 
apple|rest|town 
town|map|guide 
rest|full|down", header = TRUE, sep = "|") 


library(reshape2) 
library(tidyr) 
library(dplyr) 
gathered <- gather(df1, value = uniquevalue) 

casted <- dcast(gathered, uniquevalue ~ key) 

final <- casted %>% 
    mutate_at(c("X", "Y", "Z"), .funs = function(m) 1 * !is.na(m)) %>% 
    group_by(uniquevalue) %>% 
    summarise_all(.funs = sum) 

> final 
# A tibble: 7 × 4 
    uniquevalue  X  Y  Z 
     <chr> <dbl> <dbl> <dbl> 
1  apple  1  0  0 
2  down  0  0  1 
3  full  0  1  0 
4  guide  0  0  1 
5   map  0  1  0 
6  rest  1  1  0 
7  town  1  0  1 

Чтобы объяснить, результаты вызова в gather в этом кадре данных.

> gathered 
    key uniquevalue 
1 X  apple 
2 X  town 
3 X  rest 
4 Y  rest 
5 Y   map 
6 Y  full 
7 Z  town 
8 Z  guide 
9 Z  down 

Мы тогда dcast, что в следующий результат:

> casted 
    uniquevalue  X Y  Z 
1  apple apple <NA> <NA> 
2  down <NA> <NA> down 
3  full <NA> full <NA> 
4  guide <NA> <NA> guide 
5   map <NA> map <NA> 
6  rest rest rest <NA> 
7  town town <NA> town 

Последний вызов просто заменяет недостающие значения с 0 и не пропущенные значения с 1 и потом вроде складывает/хлюпает вместе колонке uniquevalue. И мы получаем:

> final 
# A tibble: 7 × 4 
    uniquevalue  X  Y  Z 
     <chr> <dbl> <dbl> <dbl> 
1  apple  1  0  0 
2  down  0  0  1 
3  full  0  1  0 
4  guide  0  0  1 
5   map  0  1  0 
6  rest  1  1  0 
7  town  1  0  1 
2

Вот вариант с mtabulate из qdapTools

library(qdapTools) 
t(mtabulate(df1)) 
#  X Y Z 
#apple 1 0 0 
#down 0 0 1 
#full 0 1 0 
#guide 0 0 1 
#map 0 1 0 
#rest 1 1 0 
#town 1 0 1 
Смежные вопросы