我发现了一些相关的问题,这些问题有所帮助,但是在关键部分却有所不同,所以就去了。
我有一个带有某些NA的数据框:
type <- LETTERS[1:5]
a_pc <- c(3, NA, NA , 4, 5)
b_pc <- c(NA, 2, 7, 4, 5)
a_pc_mean <- rep(mean(a_pc, na.rm = TRUE), times = 5)
b_pc_mean <- rep(mean(b_pc, na.rm = TRUE), times = 5)
df <- data.frame(type, a_pc, b_pc, a_pc_mean, b_pc_mean)
> df
type a_pc b_pc a_pc_mean b_pc_mean
1 A 3 NA 4 4.5
2 B NA 2 4 4.5
3 C NA 7 4 4.5
4 D 4 4 4 4.5
5 E 5 5 4 4.5
我想用各自平均值列中的值替换a_pc
和b_pc
列中的NA。我认为一种干净的方法是使用dplyr。到目前为止,我的代码是:
library(dplyr)
df2 <- df %>%
mutate_at(.vars = vars(ends_with("_pc")),
.funs = funs(replace(., is.na(.), ???)
我在哪里问问,我需要用手段参考各栏,但我不知道是什么。我对dplyr的理解是.
引用了vars(ends_with("_pc"))
中的列,因此我尝试将0 .
和"_mean"
粘贴到一起,但这没有用。 This这个问题很接近我,但它要求替换为固定值,而不是花药列中的值。
我的实际数据集有两列以上要替换NA的列,因此我不希望明确引用它们。
编辑
我上面的原始问题并未说明我想做什么,因此为了澄清起见,我发布了一个数据样本:
> crime_pop
subregion iso year assault kidnapping pop assault_pc kidnapping_pc
<fct> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Caribbean ABW 2008 NA NA 101353 NA NA
2 Southern Asia AFG 2008 NA NA 27294031 NA NA
3 Middle Africa AGO 2008 NA NA 21759420 NA NA
4 Southern Europe ALB 2008 363 10 2947314 0.000123 0.00000339
5 Southern Europe AND 2008 105 0 83861 0.00125 0
6 Western Asia ARE 2008 631 672 6894278 0.0000915 0.0000975
7 South America ARG 2008 145240 NA 40382389 0.00360 NA
8 Western Asia ARM 2008 201 27 2908220 0.0000691 0.00000928
9 Caribbean ATG 2008 NA NA 92478 NA NA
10 Australia and New Zealand AUS 2008 68019 611 21249200 0.00320 0.0000288
我的想法是通过计算不丢失数据的国家的人均犯罪率,对这些国家的人均犯罪率进行插值,取这些国家的次区域平均值,并将其应用于缺少数据的国家。
要计算我使用的人均犯罪率:
crime_pop <- crime_pop %>%
mutate_at(.vars = vars(assault:kidnapping),
.funs = funs(pc = . / pop))
然后可以使用@Psidom的答案来计算子区域平均值:
crime_pop2 <- crime_pop %>%
group_by(year, subregion) %>%
mutate_at(vars(ends_with("_pc")),
funs(replace(., is.na(.), mean(., na.rm = TRUE))))
现在assault
和kidnapping
中的NA需替换为pop
和assault_pc
以及pop
和kidnapping_pc
的乘积分别,这使我回到了最初的问题,即在mutate_at
中使用replace函数中的其他列。也许有一种更简单的方法可以一次性完成所有这些工作,我愿意提出建议。谢谢!
答案 0 :(得分:3)
只需使用mean(., na.rm=TRUE)
作为替代:
df %>% mutate_at(vars(ends_with('_pc')), funs(replace(., is.na(.), mean(., na.rm=TRUE))))
# type a_pc b_pc a_pc_mean b_pc_mean
#1 A 3 4.5 4 4.5
#2 B 4 2.0 4 4.5
#3 C 4 7.0 4 4.5
#4 D 4 4.0 4 4.5
#5 E 5 5.0 4 4.5
或者您可以使用执行相同操作的coalesce
,即如果.
中的值是NA,则将其替换为均值:
df %>% mutate_at(vars(ends_with('_pc')), funs(coalesce(., mean(., na.rm=TRUE))))
# type a_pc b_pc a_pc_mean b_pc_mean
#1 A 3 4.5 4 4.5
#2 B 4 2.0 4 4.5
#3 C 4 7.0 4 4.5
#4 D 4 4.0 4 4.5
#5 E 5 5.0 4 4.5
答案 1 :(得分:0)
这是一个使用'dplyr :: select'提取命名变量并将其从'Hmisc'包传递给'impute'的解决方案。
<div class="input-field s6 col" style="color: white; background-color:transparent;">
<input id="ipoza" type="text" onfocus="style='background-color:white;'" onblur="style='background-color:transparent'" value="http://i01.c.aliimg.com/img/ibank/2014/101/288/1614882101_2028072840.jpg"> <label for="ipoza"><p>Poza de Profil</p></label>
</div>
<button onclick="i()"></button>
<script type="text/javascript">
function i() {
document.getElementById("ipoza").value = "Link";
}
</script>