按一列分组,查看另一列长度不均的所有唯一结果

时间:2019-04-28 01:12:04

标签: r group-by unique

我想创建按所有唯一站点对我的数据框进行排序,并在另一列中列出所有值(不对这些值执行任何功能)。每个站点的值将具有不同的长度。我想保持数值为数字,以便以后可以进行一些数据操作(例如箱形图)。

我可以使用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 个答案:

答案 0 :(得分:3)

一种选择是for z in regress: for t in control: y,x=dmatrices('a~{}+{}'.format(z,t), data=df) print('a~{}+{}'.format(z,t)) print(y,x) a~b+e [[1.] [2.] [3.] [4.]] [[1. 5. 8.] [1. 6. 4.] [1. 7. 5.] [1. 8. 3.]] a~c+e [[1.] [2.] [3.] [4.]] [[1. 8. 8.] [1. 4. 4.] [1. 5. 5.] [1. 3. 3.]] a~d+e [[1.] [2.] [3.] [4.]] [[ 1. 1. 8.] [ 1. 3. 4.] [ 1. 55. 5.] [ 1. 3. 3.]] 保留这些值以使其保持数字状态

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

答案 1 :(得分:1)

我们可以使用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

答案 2 :(得分:0)

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

希望您对此有帮助。