Создать новый фрейм данных из списка фреймов данных, используя lapply - PullRequest
3 голосов
/ 08 апреля 2019

У меня есть список фреймов данных. Каждый список содержит два столбца «Имя» и «Код»

A

Name Code
AAA  123
BBB  456
CCC  789

B

   Name Code
   AAA  123
   AAB  124
   AAC  125

C

Name Code
BBB  456
BBA  457
BBC  458
  1. Я хотел бы создать новый фрейм данных «NEW», содержащий все уникальные имена и коды, чтобы я получил

    Имя Код AAA 123 AAB 124 AAC 125 BBB 456 BBA 457 BBC 458 CCC 789

  2. После "NEW" я бы хотел сравнить список фреймов данных с "NEW" и сказать, присутствует ли каждое имя в одном списке. Я хочу добавить новые столбцы (с именами фреймов данных в списке) к «НОВОМУ» фрейму данных и поставить «Да» или «Нет» в случае наличия.

Получите это

Name Code  A     B     C
AAA  123   YES   YES   NO
AAB  124   NO    YES   NO
AAC  125   NO    YES   NO
BBB  456   YES   NO    YES
BBA  457   No    NO    YES
BBC  458   NO    NO    YES
CCC  789   YES   NO    NO

Я бы хотел сделать с lapply, но я не уверен, как все это сделать.

Можете ли вы помочь мне

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Свяжите строки с идентификатором, затем измените форму от длинного к широкому, используя data.table :

# example data
myList <- list(A = data.frame(x = 1:3),
               B = data.frame(x = 2:4),
               C = data.frame(x = 4:6))

library(data.table)

dcast(rbindlist(myList, idcol = "ID"), x ~ ID)
#    x  A  B  C
# 1: 1  1 NA NA
# 2: 2  2  2 NA
# 3: 3  3  3 NA
# 4: 4 NA  4  4
# 5: 5 NA NA  5
# 6: 6 NA NA  6
0 голосов
/ 08 апреля 2019

Используя базу R, мы можем создать список фреймов данных и merge их вместе, используя Reduce.Для каждого списка мы проверяем, присутствует ли значение в новом объединенном фрейме данных (df_merge), и присваиваем значения «Да», «Нет» на основе их наличия / отсутствия.

list_name <- mget(c("A", "B", "C"))

df_merge <- Reduce(function(x, y) merge(x, y, all = TRUE), list_name)
df_merge[names(list_name)] <- lapply(list_name, function(x) 
                              c("No", "Yes")[(df_merge$Name %in% x$Name + 1)])


df_merge

#  Name Code   A   B   C
#1  AAA  123 Yes Yes  No
#2  BBB  456 Yes  No Yes
#3  CCC  789 Yes  No  No
#4  AAB  124  No Yes  No
#5  AAC  125  No Yes  No
#6  BBA  457  No  No Yes
#7  BBC  458  No  No Yes
...