R: Перекрестные ссылки на столбцы / обратный поиск

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

set.seed(668)
yrNames <- seq(1995,2015)
staNames <- c(LETTERS[1:12])
trpNames <- seq(1,6)
years <- rep(yrNames, times=rep(sample(1:4, length(yrNames), replace=TRUE)))
stations <- sample(staNames, length(years), replace=TRUE)
traps <- sample(trpNames, length(years), replace=TRUE)
data <- data.frame(YEAR=years, STATION=stations, TRAP=traps)

После WAY слишком много часов (усердно работая над вектором, избегая циклов) я наконец-то нашел способ:

library("reshape2")
bySta <- dcast(data, YEAR ~ STATION)
sapply(bySta, function(x){ return(bySta$YEAR[x > 0])})

Что дает то, что я хотел:

# $YEAR
#  [1] 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
# [16] 2010 2011 2012 2013 2014 2015
# $A
# [1] 2002 2009 2015
# $B
# [1] 1996 1999 2003 2007 2013
# $C
# [1] 2000 2002 2005 2006 2009 2010 2014
# # [...]

Но добраться туда было очень далеко от интуитивного, со всеми видами тупиков. Есть ли способ проще сказать "перечислите мне все df$x за значение df$y"?

Дополнительная складка в том, что я начинал со списка годичных DFS, созданных

dfList <- lapply(fileList, readDelimFunc)

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

1 ответ

Решение

dplyr решение:

data %>% group_by(STATION) %>% summarize(years = list(unique(YEAR))) %>% as.data.frame

Результаты:

   STATION                                    years
1        A                         2002, 2009, 2015
2        B             1996, 1999, 2003, 2007, 2013
3        C 2000, 2002, 2005, 2006, 2009, 2010, 2014
4        D                   2003, 2005, 2010, 2014
5        E                               1997, 2005
6        F       1996, 1997, 1998, 2001, 2014, 2015
7        G                               1996, 2001
8        H                         1995, 1997, 2003
9        I                         1996, 1997, 2008
10       J                         1999, 2001, 2009
11       K             2003, 2004, 2010, 2011, 2012
12       L                   2002, 2004, 2011, 2015

Обратите внимание, что циклы Xapply на самом деле не "векторизованы", они просто являются обертками вокруг итераций обычных вызовов функций R. (Также это решение dplyr не "векторизовано").

Лучше не зацикливаться на поиске наиболее оптимального решения, а скорее на поиске наиболее чувственного решения.

Другие вопросы по тегам