首页 > 解决方案 > 在新列中获取所有 NA [变异]

问题描述

我需要创建一个新列,它是两个或三个其他列的函数,其中一个包含一些缺失的数据 (NA)。但是,当我使用dplyr'smutate函数时,新列包含所有 NA。

请参见下面的示例:

rand_df <- data.frame(replicate(10,sample(0:10,200,rep=TRUE))) # random df
names(rand_df) <- letters[seq(from=1, to=10)]  #renaming header
rand_df$c[2:20] <- NA  # introducing NAs
head(rand_df)

 a b  c d  e f  g h i j
1  3 1  8 2  4 3  1 9 2 9
2  6 1 NA 1  2 8  8 6 0 9
3  5 7 NA 2  4 1  7 7 3 0
4 10 8 NA 6  6 7  0 2 2 0
5  4 1 NA 9  3 8  2 2 5 2
6 10 8 NA 3 10 2 10 4 5 5

试图创建一个新列

rand_df <- rand_df %>% mutate(k = 141 * min((c/88.42), 1))

head(rand_df):

a b  c d  e f  g h i j  k
1  3 1  8 2  4 3  1 9 2 9 NA
2  6 1 NA 1  2 8  8 6 0 9 NA
3  5 7 NA 2  4 1  7 7 3 0 NA
4 10 8 NA 6  6 7  0 2 2 0 NA
5  4 1 NA 9  3 8  2 2 5 2 NA
6 10 8 NA 3 10 2 10 4 5 5 NA

我知道我可以简单地使用 for 循环单独循环遍历行并跳过包含 NA 的行,但我想认为有更好的方法来做到这一点。

标签: rdplyrnamissing-data

解决方案


你可以使用 pmin()。

    library(dplyr)
    rand_df <- data.frame(replicate(10,sample(0:10,200,rep=TRUE))) # random df
    names(rand_df) <- letters[seq(from=1, to=10)]  #renaming header
    rand_df$c[2:20] <- NA  # introducing NAs
    head(rand_df)
    #>   a b  c d  e  f g  h  i  j
    #> 1 4 9  9 6 10  2 1 10 10 10
    #> 2 7 3 NA 2  5  9 1  2 10  6
    #> 3 0 3 NA 4  5  6 1  0 10  6
    #> 4 0 7 NA 5  3  6 6  9  4  7
    #> 5 4 4 NA 5  4 10 8  5  6  0
    #> 6 1 3 NA 3  0 10 1  3  7  4


    rand_df <- rand_df %>% mutate(k = 141 * pmin((c/88.42), 1))
    head(rand_df)
    #>   a b  c d  e  f g  h  i  j        k
    #> 1 4 9  9 6 10  2 1 10 10 10 14.35196
    #> 2 7 3 NA 2  5  9 1  2 10  6       NA
    #> 3 0 3 NA 4  5  6 1  0 10  6       NA
    #> 4 0 7 NA 5  3  6 6  9  4  7       NA
    #> 5 4 4 NA 5  4 10 8  5  6  0       NA
    #> 6 1 3 NA 3  0 10 1  3  7  4       NA

<sup>Created on 2020-08-17 by the [reprex package](https://reprex.tidyverse.org) (v0.3.0)</sup>


推荐阅读