如何逐行识别数据帧中的未知模式?

How to recognize unknown patterns in data frame by row?

我有一个数据框,其中连续 15 年有农业使用代码 (1-5)。每行都是代表一个字段的多边形。最终我需要 R 遍历行并识别使用模式并告诉我它们各自的频率。不幸的是,在我的真实数据集中,我有超过 1 mio。特征,因此所有可能的模式都是未知的。

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       ...

所以在这个任意示例中,代码应该识别出 id 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 次

等等所有现有组合...

不幸的是,我不知道如何处理这个问题。我没有模式识别方面的经验。

谢谢!

这是一个关于如何处理这个问题的例子,使用一个小的示例数据集(即你发布的那个)。

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      

也许是这个?

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