R - добавить столбец таблицы, чтобы отразить наличие значения в другой таблице - PullRequest
0 голосов
/ 05 ноября 2018

Я перемещаю задачу из Excel в R для воспроизводимости и возможности обрабатывать файлы данных с большим количеством записей, чем пределы Excel. Преобразование идет хорошо, но я наткнулся на контрольно-пропускной пункт из-за моих ограниченных навыков R (и навыков моих локальных коллег!)

Проблема

Тематический фрейм данных

ID    Var1   Var2  
1     0.4    0.3
2     0.4    0.1
3     0.2    0.2
4     0.3    0.7

Тип данных ListFrame

ID  Type
1    A
1    B
1    C
2    C
3    B
3    A
4    C

Что я хотел бы сделать, это добавить столбец TypeA, TypeB, TypeC из фрейма данных TypeList в фрейм данных Subject следующим образом:

ID    Var1   Var2     TypeA   TypeB   TypeC
    1     0.4    0.3   TRUE   TRUE    TRUE
    2     0.4    0.1   FALSE  FALSE   TRUE
    3     0.2    0.2   TRUE   TRUE    FALSE
    4     0.3    0.7   FALSE  FALSE   TRUE

Это упрощенный пример, фактический информационный фрейм Subject имеет около 2000 записей, TypeList имеет около 70 000 записей для около 4000 типов. Из этих типов интерес к 10 из них в настоящее время.

Любые предложения будут с благодарностью.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Один из способов сделать это:

library(tidyverse)

df2 <- df2 %>% mutate(spread_var = TRUE, Type = paste0("Type", Type)) %>% 
               spread(Type, spread_var) %>% replace(., is.na(.), FALSE)

df1 <- left_join(df1, df2)

df1

  ID Var1 Var2 TypeA TypeB TypeC
1  1  0.4  0.3  TRUE  TRUE  TRUE
2  2  0.4  0.1 FALSE FALSE  TRUE
3  3  0.2  0.2  TRUE  TRUE FALSE
4  4  0.3  0.7 FALSE FALSE  TRUE
0 голосов
/ 05 ноября 2018

Вот вариант с data.table. dcast набор данных «TypeList» в «широкий» формат и соединение с «Subject» в столбце «ID»

library(data.table)
setDT(Subject)[dcast(setDT(TypeList), ID ~ paste0("Type", Type), 
           function(x) as.logical(length(x))), on = .(ID)]
#   ID Var1 Var2 TypeA TypeB TypeC
#1:  1  0.4  0.3  TRUE  TRUE  TRUE
#2:  2  0.4  0.1 FALSE FALSE  TRUE
#3:  3  0.2  0.2  TRUE  TRUE FALSE
#4:  4  0.3  0.7 FALSE FALSE  TRUE

Или используя merge из base R

merge(`row.names<-`(Subject, Subject$ID), table(TypeList) > 0, by = "row.names")[-1]
#  ID Var1 Var2     A     B     C
#1  1  0.4  0.3  TRUE  TRUE  TRUE
#2  2  0.4  0.1 FALSE FALSE  TRUE
#3  3  0.2  0.2  TRUE  TRUE FALSE
#4  4  0.3  0.7 FALSE FALSE  TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...