Как сгруппировать строки и выложить их ячейки в виде списка в r? - PullRequest
5 голосов
/ 17 марта 2020

Я не могу сформулировать вопрос хорошо из-за моего ограниченного владения английским языком sh. Однако я хотел видеть ассоциацию ячеек моего dataframe. Имеется в виду, скажем, я выбрал «row a», а затем, как бы «row a» связать множество ассоциаций, а затем создать фрейм данных, где каждая строка соответствует списку ее ассоциаций? Я знаю несколько dplyr функций, таких как group_by или group_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

Я не смог сделать правильный поиск из-за нехватки английского языка sh. Если этот вопрос повторяется, пожалуйста, дайте мне знать. Кроме того, если вы можете перефразировать вопрос, пожалуйста, не стесняйтесь. Thankyou.

Ответы [ 4 ]

5 голосов
/ 17 марта 2020

Используя aggregate, мы можем создать значения unique, разделенные запятыми, для каждого Tracts.

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))))
3 голосов
/ 17 марта 2020

Мы можем использовать data.table методы

library(data.table)
setDT(ex_df)[, .(Cluster = toString(sort(unique(Cluster))))], .(Tracts)]
3 голосов
/ 17 марта 2020

дополнительная опция

library(tidyverse)
library(purrr)
ex_df %>% 
  group_by(Tracts) %>% 
  arrange(Cluster) %>% 
  nest() %>% 
  mutate(Cluster = map_chr(data, ~ str_c(unlist(.x), collapse = ", "))) %>% 
  select(- data)
3 голосов
/ 17 марта 2020

РЕДАКТИРОВАТЬ : я не вижу необходимости в уникальных трактатах, ответом является использование summarise вместо mutate.

Другой ответ с использованием dplyr, (Ронак Шах действительно быстрый ^^):

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