使用dplyr

时间:2018-07-14 22:22:46

标签: r dplyr

我发现了一些相关的问题,这些问题有所帮助,但是在关键部分却有所不同,所以就去了。

我有一个带有某些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_pcb_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))))

现在assaultkidnapping中的NA需替换为popassault_pc以及popkidnapping_pc的乘积分别,这使我回到了最初的问题,即在mutate_at中使用replace函数中的其他列。也许有一种更简单的方法可以一次性完成所有这些工作,我愿意提出建议。谢谢!

2 个答案:

答案 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>