【问题标题】:How to recognize unknown patterns in data frame by row?如何逐行识别数据帧中的未知模式?
【发布时间】:2020-06-02 15:19:21
【问题描述】:

我有一个数据框,其中我有连续 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 次

等等所有现有的组合...

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

谢谢!

【问题讨论】:

    标签: r dataframe design-patterns row analysis


    【解决方案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    
    

    【讨论】:

    • 谢谢,这很有帮助!!有没有办法保留字段的ID?所以我后来知道哪些字段有哪些模式?
    【解决方案2】:

    这是一个关于如何解决此问题的示例,使用一个小型示例数据集(即您发布的那个)。

    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      
    

    【讨论】:

    • 这太好了,也谢谢你!有没有办法保留字段的 ID,以便我以后可以知道哪些字段具有哪种模式?也许是一个额外的列列出了 id?
    • 是的,您可以创建一个包含元素的列 (a) ID 向量,(b) ID 作为用逗号分隔的字符串(如模式列)。
    • 你能弄清楚怎么做吗?或者你想让我更新我的答案?
    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 2017-08-28
    相关资源
    最近更新 更多