Оштрафован на поиск общих имен за несколько лет

#r

#r

Вопрос:

У меня есть данные с двумя столбцами, первый столбец — годы с 1980 по 2020 год, а второй столбец содержит символы или имена в течение каждого года. Я заинтересован в создании таблицы из двух столбцов с указанием количества раз, когда конкретное имя присутствовало в одном столбце, и лет, в которые это имя было воспроизведено, в другом столбце.

Есть идеи, как это сделать?
Заранее благодарю вас за ваше время и помощь

Ответ №1:

Вы имеете aggregate в виду, как показано ниже?

 aggregate(year ~ ., df, toString)
 

такой, что

 > aggregate(year ~ ., df, toString)
   name                         year
1     A             1983, 1990, 2012
2     B                   1984, 2007
3     C                         2014
4     D                         1981
5     E             2001, 2005, 2006
6     F                   2015, 2018
7     G                   1982, 1997
8     I                   1998, 2002
9     J 1993, 1996, 2008, 2016, 2017
10    K                         1986
11    L                         2010
12    N             1987, 1995, 2004
13    O             1999, 2011, 2019
14    R                         1988
15    S                         1989
16    T                   2013, 2020
17    U             1991, 1992, 2000
18    V                         1994
19    W                         1985
20    Y             1980, 2003, 2009
 

или table

 > table(df)
      name
year   A B C D E F G I J K L N O R S T U V W Y
  1980 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
  1981 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  1982 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
  1983 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  1984 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  1985 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
  1986 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
  1987 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
  1988 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
  1989 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
  1990 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  1991 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
  1992 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
  1993 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
  1994 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
  1995 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
  1996 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
  1997 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
  1998 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
  1999 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
  2000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
  2001 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  2002 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
  2003 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
  2004 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
  2005 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  2006 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  2007 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  2008 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
  2009 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
  2010 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
  2011 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
  2012 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  2013 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
  2014 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  2015 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  2016 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
  2017 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
  2018 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  2019 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
  2020 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
 

Данные

 set.seed(1)
df <- data.frame(
  year = 1980:2020,
  name = sample(LETTERS, 41, replace = TRUE)
)
 

Ответ №2:

Мне очень нравится решение @ThomasIsCoding, но вот решения, использующие dplyr and data.table .

Пример данных:

 dat <- data.frame(
  year = sample(1990:1993, 10, replace=TRUE),
  name = sample(letters[1:4], 10, replace=TRUE))
 

tidyverse amp; dplyr :

 library(dplyr)


dat %>%
  group_by(name) %>%
  summarize(n = n(), years = toString(sort(unique(year))))

#> # A tibble: 4 x 3
#>   name      n years     
#>   <chr> <int> <chr>     
#> 1 a         1 1993      
#> 2 b         2 1992, 1993
#> 3 c         2 1990      
#> 4 d         5 1992, 1993
 

data.table решение:

 library(data.table)

dt = data.table(dat)
dt[, .(.N, years=toString(sort(unique(year)))), by="name"]

#>    name N      years
#> 1:    b 2 1992, 1993
#> 2:    d 5 1992, 1993
#> 3:    c 2       1990
#> 4:    a 1       1993