将数组中的值分配给 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
我有一个包含美国各州数据的数据框。
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