#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