将数组中的值分配给 R 中的数据框

Assign values from array to dataframe in R

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

df 中的一列是“分区”,它告诉每个州所属的位置(“中北部”、“中南部”、“大西洋中部”、“山区”、“新区”英格兰”、“太平洋”、“南大西洋”、“中西部”、“中南部”)。

我使用名为“Life Exp:

的现有列创建了一个包含每个部门平均预期寿命的数组
avg.life.exp = tapply(df[["Life Exp"]], df$Division, mean, na.rm=TRUE)

return以下是:

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 中添加一个新列,其中包含每个部门的平均预期寿命。所以基本上我想做一个 Left Join,如果州属于 East Noth Central,它将 return 70.99000,依此类推。

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

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

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