【问题标题】:Assign values from array to dataframe in R将数组中的值分配给R中的数据框
【发布时间】:2022-01-02 13:58:34
【问题描述】:

我有一个包含美国各州数据的数据框。

df 中的一列是“Division”,表示每个州所属的位置(“East North Central”、“East South Central”、“Middle Atlantic”、“Mountain”、“New England” 、“太平洋”、“南大西洋”、“中西部”、“中西部”)。

我使用名为“Life Exp:”的现有列创建了一个数组,其中包含每个部门的平均预期寿命:

avg.life.exp = tapply(df[["Life Exp"]], df$Division, mean, na.rm=TRUE)

返回以下内容:

East North Central East South Central    Middle Atlantic 
      70.99000           69.33750           70.63667 
      Mountain        New England            Pacific 
      70.94750           71.57833           71.69400 
South Atlantic West North Central West South Central 
      69.52625           72.32143           70.43500 

现在我想在 df 中添加一个新列,其中包含每个部门的平均预期寿命。所以基本上我想做一个左连接,如果状态属于东北中部,它将返回 70.99000,依此类推。

我需要在不使用包的情况下执行此操作。

提前感谢您提供的任何帮助!

【问题讨论】:

    标签: r merge left-join aggregate


    【解决方案1】:

    一种选择是使用merge

    merge(df, data.frame(Division = names(avg.life.exp), avg.life.exp), all.x = TRUE)
    

    第二种选择是使用match

    df$avg.life.exp <- avg.life.exp[match(df$Division, names(avg.life.exp))]
    

    使用gapminder 数据集作为示例数据:

    library(gapminder)
    
    # Example data
    df <- gapminder[gapminder$year == 2007, c("country", "continent", "lifeExp")]
    
    avg.life.exp <- tapply(df[["lifeExp"]], df$continent, mean, na.rm=TRUE)
    
    avg.life.exp
    #>   Africa Americas     Asia   Europe  Oceania 
    #> 54.80604 73.60812 70.72848 77.64860 80.71950
    
    # Using merge
    df1 <- merge(df, data.frame(continent = names(avg.life.exp), avg.life.exp), all.x = TRUE)
    
    head(df1)
    #>   continent           country lifeExp avg.life.exp
    #> 1    Africa           Reunion  76.442     54.80604
    #> 2    Africa           Eritrea  58.040     54.80604
    #> 3    Africa           Algeria  72.301     54.80604
    #> 4    Africa       Congo, Rep.  55.322     54.80604
    #> 5    Africa Equatorial Guinea  51.579     54.80604
    #> 6    Africa            Malawi  48.303     54.80604
    
    # Using match
    df$avg.life.exp <- avg.life.exp[match(df$continent, names(avg.life.exp))]
    
    head(df)
    #> # A tibble: 6 × 4
    #>   country     continent lifeExp avg.life.exp
    #>   <fct>       <fct>       <dbl>        <dbl>
    #> 1 Afghanistan Asia         43.8         70.7
    #> 2 Albania     Europe       76.4         77.6
    #> 3 Algeria     Africa       72.3         54.8
    #> 4 Angola      Africa       42.7         54.8
    #> 5 Argentina   Americas     75.3         73.6
    #> 6 Australia   Oceania      81.2         80.7
    

    【讨论】:

    • 非常感谢!!这很完美!
    猜你喜欢
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 2020-12-30
    • 1970-01-01
    • 2017-10-16
    相关资源
    最近更新 更多