Как распознать неизвестные образцы в данных кадр за строкой? - PullRequest
1 голос
/ 18 февраля 2020

У меня есть фрейм данных, где у меня есть коды сельскохозяйственного использования (1-5) в течение 15 лет подряд. Каждая строка представляет собой многоугольник, представляющий поле. В конечном счете мне нужно R до l oop через ряды, распознать схемы использования и сообщить мне их соответствующую частоту. К сожалению, в моем реальном наборе данных у меня более 1 млн. особенности и, следовательно, все возможные модели не известны.

a <- data.frame(replicate(15, sample(0:5,500,rep=TRUE)))
colnames(a) <- paste0("use",2005:2019)
id <- c(1:500)
a <- cbind(id,a)

id use2005 use2006 use2007 use2008 use2009 use2010 use2011 use2012 use2013 use2014 use2015 ...
1  1       1       1       1       1       2       2       1       4       4       4       ...
2  4       4       4       4       5       5       5       0       5       5       5       ...
3  1       4       3       2       3       2       4       5       1       1       1       ...
4  1       1       1       1       1       2       2       1       4       4       4       ...
5  4       2       2       2       2       5       3       3       3       3       3       ...

Таким образом, в этом произвольном примере код должен распознавать, что идентификаторы 1 и 4 имеют одинаковый шаблон.

В конце я представляю, что результатом будет какое-то распределение частот, чтобы увидеть, есть ли определенные схемы в сельскохозяйственном использовании моих полей.

Например:

1 1 1 1 1 2 1 1 1 3 2 4 1 1 1

[50] - встречается 50 раз

5 5 5 5 5 1 1 1 1 4 4 4 2 2 3

[35] - встречается 35 раз

и т. Д. Со всеми существующими комбинациями ...

К сожалению Я понятия не имею, как подойти к этому. У меня нет опыта распознавания образов.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

может быть, это?

library(tidyverse)
a[, -1] %>% group_by_all %>% count
#  use2005 use2006 use2007 use2008 use2009 use2010 use2011 use2012 use2013 use2014 use2015     n
#     <int>   <int>   <int>   <int>   <int>   <int>   <int>   <int>   <int>   <int>   <int> <int>
# 1       1       1       1       1       1       2       2       1       4       4       4     2
# 2       1       4       3       2       3       2       4       5       1       1       1     1
# 3       4       2       2       2       2       5       3       3       3       3       3     1
# 4       4       4       4       4       5       5       5       0       5       5       5     1

или если вы хотите включить поля, вы можете изменить на group_by_at и исключить id из группирующих, а затем paste полей вместе:

a %>%
  group_by_at(vars(-id)) %>%
  summarise(n = n(), ids = paste(id, collapse= "," ))
#   use2005 use2006 use2007 use2008 use2009 use2010 use2011 use2012 use2013 use2014 use2015     n ids  
#     <int>   <int>   <int>   <int>   <int>   <int>   <int>   <int>   <int>   <int>   <int> <int> <chr>
# 1       1       1       1       1       1       2       2       1       4       4       4     2 1,4  
# 2       1       4       3       2       3       2       4       5       1       1       1     1 3    
# 3       4       2       2       2       2       5       3       3       3       3       3     1 5    
# 4       4       4       4       4       5       5       5       0       5       5       5     1 2    
0 голосов
/ 18 февраля 2020

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

library(tidyverse)

# example dataset
a = read.table(text = "
id use2005 use2006 use2007 use2008 use2009 use2010 use2011 use2012 use2013 use2014 use2015
1  1       1       1       1       1       2       2       1       4       4       4      
2  4       4       4       4       5       5       5       0       5       5       5      
3  1       4       3       2       3       2       4       5       1       1       1      
4  1       1       1       1       1       2       2       1       4       4       4      
5  4       2       2       2       2       5       3       3       3       3       3
", header=T)

a %>%
  group_nest(id) %>%                                           # for each row
  mutate(pattern = map(data, ~paste(.x, collapse = ","))) %>%  # create the pattern as a string
  unnest(pattern) %>%                                          # unnest pattern column
  count(pattern, sort = T)                                     # count patterns

# # A tibble: 4 x 2
#   pattern                   n
#   <chr>                 <int>
# 1 1,1,1,1,1,2,2,1,4,4,4     2
# 2 1,4,3,2,3,2,4,5,1,1,1     1
# 3 4,2,2,2,2,5,3,3,3,3,3     1
# 4 4,4,4,4,5,5,5,0,5,5,5     1      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...