Найдите количество раз, когда уникальное значение появляется в нескольких файлах, и количество этих файлов - PullRequest
2 голосов
/ 07 июля 2019

У меня есть эти три кадра данных ниже:

Name<-c("jack","jack","bob","david","mary")
n1<-data.frame(Name)

Name<-c("jack","bill","dean","mary","steven")
n2<-data.frame(Name)

Name<-c("fred","alex","mary")
n3<-data.frame(Name)

Я хотел бы создать новый фрейм данных с 3 столбцами. Все уникальные имена присутствуют во всех 3 исходных файлах в столбце 1, число исходных файлов, в которых он находится, в столбце 2 и общее количество экземпляров этого имени во всех файлах в столбце 3.

Результат должен быть как

Name Number_of_files Number_of_instances
1   jack               2                   3
2    bob               1                   1
3  david               1                   1
4   mary               3                   3
5   bill               1                   1
6   dean               1                   1
7 steven               1                   1
8   fred               1                   1
9   alex               1                   1

Есть ли автоматизированный способ достичь всего этого сразу?

Ответы [ 2 ]

4 голосов
/ 07 июля 2019

Одна dplyr возможность может быть:

bind_rows(n1, n2, n3, .id = "ID") %>%
 group_by(Name) %>%
 summarise(Number_of_files = n_distinct(ID),
           Number_of_instances = n())

  Name   Number_of_files Number_of_instances
  <chr>            <int>               <int>
1 alex                 1                   1
2 bill                 1                   1
3 bob                  1                   1
4 david                1                   1
5 dean                 1                   1
6 fred                 1                   1
7 jack                 2                   3
8 mary                 3                   3
9 steven               1                   1
1 голос
/ 07 июля 2019

Это концептуально похожий ответ как @tmfmnk, но базовая версия R

#Get names of all the objects n1, n2, n3, n4 . etc
name_df <- ls(pattern = "n\\d+")

#Combine them in one dataframe
all_df <- do.call(rbind, Map(cbind, mget(name_df), id = name_df))

#get aggregated values
aggregate(id~Name, all_df, function(x) c(length(unique(x)), length(x)))

#    Name id.1 id.2
#1    bob    1    1
#2  david    1    1
#3   jack    2    3
#4   mary    3    3
#5   bill    1    1
#6   dean    1    1
#7 steven    1    1
#8   alex    1    1
#9   fred    1    1

При необходимости можно переименовать столбцы.


И для полноты data.table версия

library(data.table)

dt < - rbindlist(mget(name_df), idcol = "ID")
dt[,  list(Number_of_files = uniqueN(ID), Number_of_instances = .N), by = .(Name)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...