【问题标题】:Aggregate and adding new column聚合并添加新列
【发布时间】:2019-09-27 16:11:28
【问题描述】:

我有一个包含地区名称、家庭纬度和经度的数据集。数据集有 2000 household locations。我想根据地区名称计算纬度和经度的平均值。接下来,我想添加两个新列(即 Lat_mean、Long_mean),其中将存储每个家庭的平均 Lat 和 Long。

我只是能够汇总纬度和经度的平均值。我不知道如何将汇总数据粘贴为每个 ID 的新列(见代码)

id <- c(1,2,3,4,5,6)
district <- c("A", "B", "C", "A", "A", "B")
lat <- c(28.6, 30.2, 35.9, 27.5, 27.9, 31.5)
long <- c(77.5, 85.2, 66.5, 75.0, 79.2, 88.8)
df <- data.frame(id, district, lat, long)

df_group <- df %>% group_by(district) %>% summarise_at(vars(lat:long), mean)

我期待以下。 Lat_mean & Long_mean 列将添加到“df”,每个 ID 将具有基于地区名称的值。见下图。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以使用mutate_at 代替summarise_at。在list 中,指定name,这样它将创建一个以suffix 作为名称的新列

    library(dplyr)
    df %>% 
       group_by(district) %>%
       mutate_at(vars(lat, long), list(mean = mean))
    # A tibble: 6 x 6
    # Groups:   district [3]
    #     id district   lat  long lat_mean long_mean
    #  <dbl> <fct>    <dbl> <dbl>    <dbl>     <dbl>
    #1     1 A         28.6  77.5     28        77.2
    #2     2 B         30.2  85.2     30.8      87  
    #3     3 C         35.9  66.5     35.9      66.5
    #4     4 A         27.5  75       28        77.2
    #5     5 A         27.9  79.2     28        77.2
    #6     6 B         31.5  88.8     30.8      87  
    

    【讨论】:

      【解决方案2】:
      > df %>% 
          mutate(lat_mean = ave(lat, district, FUN=mean),
                 lon_mean = ave(long, district, FUN=mean))
        id district  lat long lat_mean lon_mean
      1  1        A 28.6 77.5    28.00 77.23333
      2  2        B 30.2 85.2    30.85 87.00000
      3  3        C 35.9 66.5    35.90 66.50000
      4  4        A 27.5 75.0    28.00 77.23333
      5  5        A 27.9 79.2    28.00 77.23333
      6  6        B 31.5 88.8    30.85 87.00000
      

      【讨论】:

      • 非常感谢。
      猜你喜欢
      • 2017-02-03
      • 2021-06-26
      • 1970-01-01
      • 2021-11-10
      • 2020-11-13
      • 2019-12-22
      • 2021-11-21
      • 2011-06-28
      • 2012-08-31
      相关资源
      最近更新 更多