【问题标题】:How to group rows and get their cell associations layed out in a list form in r?如何对行进行分组并在 r 中以列表形式排列它们的单元格关联?
【发布时间】:2020-06-28 16:03:04
【问题描述】:

由于我的英语水平有限,我无法很好地表达这个问题。但是我想查看我的数据框的单元格关联。意思是,假设我选择“a 行”,那么“a 行”的许多关联如何,然后制作一个数据框,其中每行对应于其关联列表?我知道几个dplyr 函数,比如group_bygroup_splits,但是我无法做到这些。这是我的目标:

ex_df  <- data.frame(Tracts= c(500, 200, 420, 317, 783, 200, 200, 500, 317, 783),
                    Cluster = c(1, 2, 3, 4, 4, 5,1, 2 ,4,3))
#gives:
#       Tracts Cluster
# 1     500       1
# 2     200       2
# 3     420       3
# 4     317       4
# 5     783       4
# 6     200       5
# 7     200       1
# 8     500       2
# 9     317       4
# 10    783       3

# Now how do I get the dataframe where I can get list (or character vector is ok) 
# of cell associations? Something like this:

#Required output:
#    Tracts Contained_cluster
# 1   500       1,2
# 2   200       1,2,5
# 3   420       3
# 4   317       4
# 5   783       3,4

由于缺乏英语能力,我无法进行适当的搜索。如果这个问题是重复的,请告诉我。另外,如果您可以重新表述问题,请随意。谢谢。

【问题讨论】:

  • aggregate(Cluster~Tracts, ex_df, function(x) toString(unique(x)))
  • 你是最棒的,你总是回答我愚蠢的问题。我可以通过排序进行进一步的更改,以便它到达输出表单。你会提供这个作为答案,以便获得声誉吗?我很乐意这样做。

标签: r dataframe data-manipulation


【解决方案1】:

使用aggregate,我们可以为每个Tracts 创建一个以逗号分隔的unique 值。

aggregate(Cluster~Tracts, ex_df, function(x) toString(sort(unique(x))))

#  Tracts Cluster
#1    200 1, 2, 5
#2    317       4
#3    420       3
#4    500    1, 2
#5    783    3, 4

或者同样使用dplyr

library(dplyr)
ex_df %>% group_by(Tracts) %>% summarise(Cluster = toString(sort(unique(Cluster))))

【讨论】:

  • 谢谢你罗纳克!
【解决方案2】:

编辑:我没有看到需要独特的 Tracts,答案是使用 summarise 而不是 mutate

使用dplyr 的另一个答案,(Ronak Shah 确实很快 ^^):

ex_df  <- data.frame(Tracts= c(500, 200, 420, 317, 783, 200, 200, 500, 317, 783),
             Cluster = c(1, 2, 3, 4, 4, 5,1, 2 ,4,3))

suppressPackageStartupMessages( library(dplyr) )

# --- If one Tract needed 
ex_df %>% 
    group_by(Tracts) %>% 
    summarise(Cluster = paste(Cluster, collapse = ", ")) %>%  
    arrange(Tracts)

# --- If modification per rows
ex_df %>% 
    group_by(Tracts) %>% 
    mutate(Cluster = paste(Cluster, collapse = ", ")) %>% 
    ungroup() %>% 
    arrange(Tracts)
#> # A tibble: 10 x 2
#>    Tracts Cluster
#>     <dbl> <chr>  
#>  1    200 2, 5, 1
#>  2    200 2, 5, 1
#>  3    200 2, 5, 1
#>  4    317 4, 4   
#>  5    317 4, 4   
#>  6    420 3      
#>  7    500 1, 2   
#>  8    500 1, 2   
#>  9    783 4, 3   
#> 10    783 4, 3

【讨论】:

    【解决方案3】:

    附加选项

    library(tidyverse)
    library(purrr)
    ex_df %>% 
      group_by(Tracts) %>% 
      arrange(Cluster) %>% 
      nest() %>% 
      mutate(Cluster = map_chr(data, ~ str_c(unlist(.x), collapse = ", "))) %>% 
      select(- data)
    

    【讨论】:

    • 谢谢哥们。这篇文章的另一个重要补充!
    【解决方案4】:

    我们可以使用data.table 方法

    library(data.table)
    setDT(ex_df)[, .(Cluster = toString(sort(unique(Cluster))))], .(Tracts)]
    

    【讨论】:

    • 谢谢阿克伦!先生,也感谢您的意见。上帝保佑,并保持安全!
    猜你喜欢
    • 1970-01-01
    • 2018-11-09
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多