【问题标题】:Group by one column and see all unique results of another column of uneven lengths按一列分组并查看另一列不均匀长度的所有唯一结果
【发布时间】:2019-04-28 01:12:03
【问题描述】:

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

我可以使用 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 行只有一个值而不是两个值)。

提前谢谢你!

【问题讨论】:

  • 您的期望似乎自相矛盾。您想要独特的网站,同时还提到“不想聚合”。另外,当您希望变量列出所有值时,“我需要第三列是数字,而不是字符串”是什么意思。在select 声明之前,您的方法很好。
  • 嗨@liuminzhao,很抱歉。我已经对我正在寻找的内容进行了更详细的解释。我只是看到,当你使用聚合时,你必须使用一些函数(即平均值,最大值),但我不希望那样。我想要该值列的原始值,而无需完成任何汇总统计。是选择问题吗?

标签: r group-by unique


【解决方案1】:

一种选择是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

【讨论】:

  • 感谢您的帮助!有没有办法在情节中调用列“值”?我试图为所有数据制作箱线图。我不想做某种循环,因为我不想为每个独特的网站提供单独的箱线图。
  • boxplot(temp$LAT~data(temp$data), main="LAT", xlab="value", ylab="residuals") 例如,这是行不通的。
  • @Tammy 如果您不想将它们分开绘制,那么为什么不boxplot(LAT~value, samp_data, main="LAT", xlab="value", ylab="residuals") '。为什么需要总结它们?
  • 谢谢@Ronak!除了箱形图之外,我还进行了其他分析(箱形图只是一种更直接的挫败感),所以我试图找到一种方法,基本上只使用一个整洁的数据框,同时能够运行任何数值计算。
【解决方案2】:

我们可以将“值”放在listsummarise

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")

-情节

【讨论】:

  • 谢谢!这使我可以为下一步制作箱线图。制作一行 = 一个站点并不那么整洁,但在我看来,根据我读过的其他帮助页面,这是不可能的?另外,你能解释一下你最后一步的逻辑吗?我不太明白在列表中使用summary。
  • 我现在看到了你所看到的,并认为我明白了!!之前,我只是得到一个输出列表,而不是你在上面发布的结果(这有助于查看感谢你的编辑)。我上传了库(plyr)和库(dplyr),通过删除plyr和dplyr,只上传dplyr,我终于得到了一个像你这样的数据框。我认为 plyr 是由其他包导入的,当两个包都上传时,存在某种冲突。
  • @Tammy 这个问题是因为屏蔽了函数。 plyr 具有 summarise/mutate 并掩盖了 dplyr 函数(汇总/变异)。您可以明确提及%&gt;% dplyr::summarise(
  • @Tammy 如果你需要一个箱线图out %&gt;% unnest %&gt;% boxplot(value ~ LAT, data = ., main = "residuals by covariate", xlab = "LAT", ylab = "value")
  • 是的!最后一个代码正是我想要的,并且花了几个小时(几天)试图去做!谢谢!
【解决方案3】:

group_by() 之后使用unique() 怎么样?

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

希望对您有所帮助。

【讨论】:

  • 谢谢!它让我可以进行下一步,但这并不理想,因为第 9 行应该出现两次。
猜你喜欢
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 2022-01-11
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多