получить информацию из каждой уникальной пары - PullRequest
0 голосов
/ 21 января 2019

У меня есть координаты для каждого сайта и год выборки каждого сайта (поддельные данные ниже).

dfA<-matrix(nrow=20,ncol=3)
dfA<-as.data.frame(dfA)
colnames(dfA)<-c("LAT","LONG","YEAR")
#fill LAT
dfA[,1]<-rep(1:5,4)
#fill LONG
dfA[,2]<-c(rep(11:15,3),16:20)
#fill YEAR
dfA[,3]<-2001:2020

> dfA
    LAT LONG YEAR
 1    1   11 2001
 2    2   12 2002
 3    3   13 2003
 4    4   14 2004
 5    5   15 2005
 6    1   11 2006
 7    2   12 2007
 8    3   13 2008
 9    4   14 2009
 10   5   15 2010
 11   1   11 2011
 12   2   12 2012
 13   3   13 2013
 14   4   14 2014
 15   5   15 2015
 16   1   16 2016
 17   2   17 2017
 18   3   18 2018
 19   4   19 2019
 20   5   20 2020

Я пытаюсь выбрать год, когда было отобрано каждое уникальное место. Поэтому я сначала вытащил каждое уникальное местоположение и время его выборки, используя следующий код

dfB <- dfA %>% 
group_by(LAT, LONG) %>%
summarise(Freq = n())
dfB<-as.data.frame(dfB) 

   LAT LONG Freq
1    1   11    3
2    1   16    1
3    2   12    3
4    2   17    1
5    3   13    3
6    3   18    1
7    4   14    3
8    4   19    1
9    5   15    3
10   5   20    1

Я сейчас пытаюсь получить год для каждого уникального местоположения. То есть Я в конечном итоге хочу это:

   LAT LONG Freq .  Year
1    1   11    3 .  2001,2006,2011
2    1   16    1 .  2016
3    2   12    3 .  2002,2007,2012
4    2   17    1
5    3   13    3
6    3   18    1
7    4   14    3
8    4   19    1
9    5   15    3
10   5   20    1

Вот что я пробовал:

1) Найдите, какие строки в dfA соответствуют dfB:

dfB$obs_Year<-NA
idx <- match(paste(dfA$LAT,dfA$LONG), paste(dfB$LAT,dfB$LONG))

> idx
[1]  1  3  5  7  9  1  3  5  7  9  1  3  5  7  9  2  4  6  8 10

То есть idx [1] означает, что dfA [1] соответствует dfB [1]. И что dfA [6], df [11] все соответствуют dfB [1].

Я пытался извлечь эту информацию:

for (row in 1:20){
  year<-as.character(dfA$YEAR[row])
  tmp<-dfB$obs_Year[idx[row]]
  if(isTRUE(is.na(dfB$obs_Year[idx[row]]))){
    dfB$obs_Year[idx[row]]<-year
  }
  if(isFALSE(is.na(dfB$obs_Year[idx[row]]))){
    dfB$obs_Year[idx[row]]<-as.list(append(tmp,year))
  }
}

Я получаю этот код ошибки:

number of items to replace is not a multiple of replacement length

Кто-нибудь знает, как извлечь годы из соответствующих пар dfA в dfB? Я не знаю, если это самый эффективный код, но это насколько я получил .... Спасибо заранее!

1 Ответ

0 голосов
/ 21 января 2019

Это можно сделать с помощью цепочки dplyr, которая сначала строит столбец даты, а затем фильтрует только уникальные наблюдения.

Логика состоит в том, чтобы построить переменную даты, сгруппировав ваши данные по местоположениям, а затем вставив все даты для данного местоположения в одну строковую переменную, которую мы называем year_string. Затем мы также вычисляем частоту, но это не является строго необходимым.

Единственный столбец в ваших данных, который меняется со временем, это ГОД, что означает, что если мы исключим этот столбец, вы увидите значения, повторяющиеся для местоположений. Поэтому мы исключаем столбец YEAR и затем просим R вернуть нам unique() значения data.frame. Он выберет одно из наблюдений в каждой точке, где встречаются несколько объектов, но, поскольку они идентичны, это не имеет значения.

Код ниже:

library(dplyr)

dfA<-matrix(nrow=20,ncol=3)
dfA<-as.data.frame(dfA)
colnames(dfA)<-c("LAT","LONG","YEAR")
#fill LAT
dfA[,1]<-rep(1:5,4)
#fill LONG
dfA[,2]<-c(rep(11:15,3),16:20)
#fill YEAR
dfA[,3]<-2001:2020

# We assign the output to dfB
dfB <- dfA %>% group_by(LAT, LONG) %>% # We group by locations
  mutate( # The mutate verb is for building new variables.
    year_string = paste(YEAR, collapse = ","), # the function paste()
                          # collapses the vector YEAR into a string
                          # the argument collapse = "," says to 
                          # separate each element of the string with a comma
         Freq = n()) %>% # I compute the frequency as you did
  select(LAT, LONG, Freq, year_string) %>% 
             # Now I select only the columns that index
             # location, frequency and the combined years
  unique() # Now I filter for only unique observations. Since I have not picked
           # YEAR in the select function only unique locations are retained

dfB
#> # A tibble: 10 x 4
#> # Groups:   LAT, LONG [10]
#>      LAT  LONG  Freq year_string   
#>    <int> <int> <int> <chr>         
#>  1     1    11     3 2001,2006,2011
#>  2     2    12     3 2002,2007,2012
#>  3     3    13     3 2003,2008,2013
#>  4     4    14     3 2004,2009,2014
#>  5     5    15     3 2005,2010,2015
#>  6     1    16     1 2016          
#>  7     2    17     1 2017          
#>  8     3    18     1 2018          
#>  9     4    19     1 2019          
#> 10     5    20     1 2020

Создано в 2019-01-21 пакетом Представление (v0.2.1)

...