Сгруппируйте по одному столбцу и просмотрите все уникальные результаты другого столбца неравной длины. - PullRequest
2 голосов
/ 28 апреля 2019

Я хочу создать сортировку моего фрейма данных по всем уникальным сайтам и перечислить все значения в другом столбце (без выполнения каких-либо функций для этих значений). Значения для каждого сайта будут разной длины. Я хочу, чтобы значения были числовыми, чтобы впоследствии я мог выполнять некоторые манипуляции с данными (например, графические диаграммы).

Я могу использовать tidyverse и создать строку из неровных символов.

Пример данных

a<-data.frame(c(41.14542,41.14542,41.14542,41.14542,41.14542), 
c(-74.1129,-74.1129,-74.1129,-74.1129,-74.1129), c(89,36,20,26,35))
colnames(a)<-c("LAT","LONG","value")
b<-data.frame(c(43.00309,43.00309,43.00309), 
c(-75.02384,-75.02384,-75.02384), c(1,17,20))
colnames(b)<-c("LAT","LONG","value")
c<-data.frame(c(43.17203,43.17203), c(-77.52824,-77.52824), c(2,2))
colnames(c)<-c("LAT","LONG","value")
samp_data<-rbind(a,b,c)

Код, который я пробовал

library(tidyverse)
samp<-samp_data %>% group_by(LAT, LONG) %>%  mutate(value_string = paste(value, collapse = ",")) %>% select(LAT, LONG, value_string) %>% unique()

Это дает мне такой результат:

    LAT  LONG value_string   
    <dbl> <dbl> <chr>        
1  41.1 -74.1 89,36,20,26,35
2  43.0 -75.0 1,17,20       
3  43.2 -77.5 2,2    

* Я не знаю, почему он округляет мои значения LAT / LONG.

Мне нужно, чтобы третий столбец был числовым, а не строкой символов. Так что-то вроде этого будет работать (обратите внимание на класс value_string):

    LAT  LONG value_string   
    <dbl> <dbl> <dbl>        
1  41.1 -74.1 89,36,20,26,35
2  43.0 -75.0 1,17,20       
3  43.2 -77.5 2,2  

Я смотрел на агрегат (кажется, требует применения какой-то функции), играл со списками (у меня были проблемы с неравной длиной для каждого сайта), но я не мог заставить их работать.

Кроме того, я не хочу агрегировать, то есть сайт (43.17203, -77.52824) должен отображаться дважды, а не рассматриваться как одна строка. Так что это не было бы идеально:

    LAT  LONG value_string   
    <dbl> <dbl> <chr>        
1  41.1 -74.1 89,36,20,26,35
2  43.0 -75.0 1,17,20       
3  43.2 -77.5 2 

(строка 3 только с одним значением вместо двух значений).

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 28 апреля 2019

Один из вариантов - nest эти значения, чтобы сохранить их числовыми

library(dplyr)

temp <- samp_data %>%
          group_by(LAT, LONG) %>%
         tidyr::nest(value)
temp

#    LAT  LONG data            
#   <dbl> <dbl> <list>          
#1  41.1 -74.1 <tibble [5 × 1]>
#2  43.0 -75.0 <tibble [3 × 1]>
#3  43.2 -77.5 <tibble [2 × 1]>

Это будет иметь data столбец в качестве значения списка, и каждый из них будет иметь числовой столбец с именем value.

str(temp$data)
#List of 3
# $ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  5 obs. of  1 variable:
#  ..$ value: num [1:5] 89 36 20 26 35
# $ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  3 obs. of  1 variable:
#  ..$ value: num [1:3] 1 17 20
# $ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  2 obs. of  1 variable:
#  ..$ value: num [1:2] 2 2
1 голос
/ 28 апреля 2019

Мы можем поместить 'значение' в list с summarise

library(dplyr)
out <- samp_data %>% 
          group_by(LAT, LONG) %>% 
          summarise(value = list(unique(value)))
out
# A tibble: 3 x 3
# Groups:   LAT [3]
#    LAT  LONG value    
#  <dbl> <dbl> <list>   
#1  41.1 -74.1 <dbl [5]> #note the different length of the list column
#2  43.0 -75.0 <dbl [3]>
#3  43.2 -77.5 <dbl [1]>

Мы можем получить боксы с

out %>%
  unnest %>% 
  boxplot(value ~ LAT, data = ., main = "residuals by covariate",
        xlab = "LAT", ylab = "value")

-плотом

enter image description here

0 голосов
/ 28 апреля 2019

Как насчет использования unique() сразу после group_by()?

samp_data_unique = samp_data %>% 
  group_by(LAT, LONG) %>% 
  unique()

Это сработало для меня. И вывод будет выглядеть следующим образом.

> samp_data_unique
# A tibble: 9 x 3
# Groups:   LAT, LONG [3]
    LAT  LONG value
  <dbl> <dbl> <dbl>
1  41.1 -74.1    89
2  41.1 -74.1    36
3  41.1 -74.1    20
4  41.1 -74.1    26
5  41.1 -74.1    35
6  43.0 -75.0     1
7  43.0 -75.0    17
8  43.0 -75.0    20
9  43.2 -77.5     2

Надеюсь, вы найдете это полезным.

...