Подсчитайте несколько столбцов, удалив дубликаты в R - PullRequest
1 голос
/ 28 января 2020

У меня есть большие данные, но они похожи на следующие данные:

df1<-read.table(text=" A1	A2	A3	A4

Rose,Sarah	Rose,Sarah	Smith,Roger	Emily,Cute
Rose,Sarah	Emily,Cute	Smith,Roger	Emily,Cute
Emily,Cute	Rose,Sarah	Smith,Roger	Dave,Yellow
Emily,Cute	John,Price	Hana,Pipe	Dave,Yellow
John,Price	Rose,Sarah	Hana,Pipe	Dave,Yellow
John,Price	John,Price	Hana,Pipe	Dave,Yellow
John,Price	Rose,Sarah	Smith,Roger	Dave,Yellow

",header=TRUE)

Я хочу посчитать имена по столбцам. Вот предполагаемый вывод.

Column	    Name	Time
A1,A2,A4  Emily,Cute	   3
A1,A2	    Rose,Sarah	   2
A1,A2	   John,Price	     2
A3	     Smith,Roger	  1
A3	     Hana,Pipe	    1
A4	     Dave,Yellow	 1
Total   	6	           10

Можем ли мы сделать это в R? Th

Ответы [ 2 ]

3 голосов
/ 28 января 2020

Один dplyr и tidyr параметр может быть:

df1 %>%
 pivot_longer(everything(), names_to = "Column", values_to = "Name") %>%
 group_by(Name, Column) %>%
 slice(1) %>%
 group_by(Name) %>%
 summarise(Column = toString(Column),
           Time = n())

  Name        Column      Time
  <fct>       <chr>      <int>
1 Emily,Cute  A1, A2, A4     3
2 John,Price  A1, A2         2
3 Rose,Sarah  A1, A2         2
4 Hana,Pipe   A3             1
5 Smith,Roger A3             1
6 Dave,Yellow A4             1

Если вы хотите получить точные результаты, также с итогами:

df1 %>%
 pivot_longer(everything(), names_to = "Column", values_to = "Name") %>%
 group_by(Name, Column) %>%
 slice(1) %>%
 group_by(Name) %>%
 summarise(Column = toString(Column),
           Time = n()) %>%
 ungroup() %>%
 mutate_if(is.factor, as.character) %>%
 add_row() %>%
 mutate(Name = ifelse(row_number() == max(row_number()), n_distinct(Name)-1, Name),
        Column = ifelse(row_number() == max(row_number()), "Total", Column),
        Time = ifelse(row_number() == max(row_number()), sum(Time, na.rm = TRUE), Time)) %>%
 select(Column, Name, Time)

  Column     Name         Time
  <chr>      <chr>       <int>
1 A1, A2, A4 Emily,Cute      3
2 A1, A2     John,Price      2
3 A1, A2     Rose,Sarah      2
4 A3         Hana,Pipe       1
5 A3         Smith,Roger     1
6 A4         Dave,Yellow     1
7 Total      6              10
1 голос
/ 28 января 2020

Вы можете преобразовать в "длинный", а затем суммировать по имени. (Тот же подход, что и для ответа dplyr)

library(data.table)
setDT(df1)

long <- melt(df1[, r := 1:.N], 'r')
long[, .(Column = toString(unique(variable)), 
         Time = uniqueN(variable)), 
     by = .(Name = value)]

#           Name     Column Time
# 1:  Rose,Sarah     A1, A2    2
# 2:  Emily,Cute A1, A2, A4    3
# 3:  John,Price     A1, A2    2
# 4: Smith,Roger         A3    1
# 5:   Hana,Pipe         A3    1
# 6: Dave,Yellow         A4    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...