Одинаковые вычисления для разных наборов данных - PullRequest
0 голосов
/ 03 августа 2020

Я новичок в R и пытаюсь решить следующую проблему. У меня есть 30 наборов данных, для которых мне нужно применить те же вычисления. Наборы данных содержат имена, и мне нужно найти имена, которые включены во все столбцы в каждом наборе данных. Все наборы данных имеют 4 столбца. Для простоты предположим, что у меня есть следующие 3 набора данных:

df1<- data.frame(x1=c("Ben","Alex","Tim", "Lisa", "MJ"), 
x2=c("Ben","Paul","Tim", "Linda", "Alex", "MJ"), 
x3=c("Tomas","Alex","Ben", "Paul", "MJ", "Tim"), 
x4=c("Ben","Alex","Tim", "Lisa", "MJ", "Ben"))

df2<- data.frame(x1=c("Alex","Tyler","Ben", "Lisa", "MJ"), 
x2=c("Ben","Paul","Tim", "Linda", "Tyler", "MJ"), 
x3=c("Tyler","Alex","Ben", "Tyler", "MJ"), 
x4=c("Ben","Alex","Tim", "Lisa", "MJ", "Tyler"))

df3<- data.frame(x1=c("Lisa","Tyler","Ben", "Lisa", "MJ"), 
x2=c("Lisa","Paul","Tim", "Linda", "Tyler", "MJ"), 
x3=c("Tyler","Alex","Ben", "Tyler", "MJ", "Lisa"), 
x4=c("Ben","Alex","Tim", "Lisa", "MJ", "Tyler"))

Моя идея заключалась в том, что я сначала извлекаю каждое уникальное имя в каждом наборе данных (поскольку они различаются и иногда встречаются в наборе данных несколько раз) и затем посмотрите, включены ли эти уникальные имена в каждый столбец каждого набора данных. Поэтому я уже объединил все наборы данных в список наборов данных, используя:

df_list<-list(df1,df2,df3)

Затем я извлек уникальные имена в каждом наборе данных, используя:

unique_list <- lapply(df_list,  function(x) {
  as.vector(unique(unlist(x)))
})

Вот где я застрял. Я не знаю, как сравнивать список уникальных имен с каждым столбцом каждого набора данных. Я бы сделал это для каждого набора данных отдельно следующим образом:

u<-as.vector(unique(unlist(df1)))
n<- ifelse(u%in%df1$x1 & u%in%df1$x2 & u%in%df1$x3 & 
               u%in%df1$x4", 1, 0)
Names_1<-cbind(u, n) #values with a 1 are the names included in all columns of dataset

Есть ли хороший способ выполнить вышеуказанный расчет для всех наборов данных сразу?

Заранее большое спасибо !

1 Ответ

0 голосов
/ 04 августа 2020

попробуйте так

library(tidyverse)
library(janitor)
df1<- data.frame(x1=c("Ben","Alex","Tim", "Lisa", "MJ"), 
                 x2=c("Ben","Paul","Tim", "Linda", "Alex"), 
                 x3=c("Tomas","Alex","Ben", "Paul", "MJ"), 
                 x4=c("Ben","Alex","Tim", "Lisa", "MJ"))

df2<- data.frame(x1=c("Alex","Tyler","Ben", "Lisa", "MJ"), 
                 x2=c("Ben","Paul","Tim", "Linda", "Tyler"), 
                 x3=c("Tyler","Alex","Ben", "Tyler", "MJ"), 
                 x4=c("Ben","Alex","Tim", "Lisa", "MJ"))

df3<- data.frame(x1=c("Lisa","Tyler","Ben", "Lisa", "MJ"), 
                 x2=c("Ben","Paul","Tim", "Linda", "Tyler"), 
                 x3=c("Tyler","Alex","Ben", "Tyler", "MJ"), 
                 x4=c("Ben","Alex","Tim", "Lisa", "MJ"))

df <- bind_cols(df1, df2, df3) %>% clean_names()

uniq_name <- df %>% 
  pivot_longer(everything(), names_to = NULL) %>% 
  distinct() %>% 
  pull()

map(uniq_name, ~ colSums(df == .x) >= 1) %>% 
  map_lgl(all) %>% 
  as_tibble() %>% 
  add_column(uniq_name) %>% 
  filter(value)

# A tibble: 1 x 2
  value uniq_name
  <lgl> <chr>    
1 TRUE  Ben 
...