使用dplyr将值的一部分更改为NA

xesrikrc  于 2023-03-20  发布在  其他
关注(0)|答案(2)|浏览(123)

我有一个大型 Dataframe ,希望将value1的随机10%替换为NA,并将value2的另一个随机20%替换为NA
我在做这个,它很有效,但不漂亮。有更好的方法吗?

df%>%
  mutate(rand = runif(1:length(df$id)),
         value1 = replace(value1, which(rand < 0.1), NA),
         rand = runif(1:length(df$id)),
         value2 = replace(value2, which(rand < 0.2), NA))
zbdgwd5y

zbdgwd5y1#

一个简单的方法是将重复的部分提取为函数,并直接替换向量的部分,而不是创建一个新列:

library(tidyverse)

replace_with_na <- function(nums, prop) {
  nums[runif(length(nums)) < prop] <- NA
  nums
}

tibble(value1 = 1:100,
       value2 = 101:200) |> 
  mutate(value1 = replace_with_na(value1, 0.1),
         value2 = replace_with_na(value2, 0.2))

#> # A tibble: 100 × 2
#>    value1 value2
#>     <int>  <int>
#>  1      1    101
#>  2      2    102
#>  3      3    103
#>  4     NA     NA
#>  5      5    105
#>  6      6    106
#>  7      7     NA
#>  8      8    108
#>  9      9    109
#> 10     10    110
#> # … with 90 more rows

这实际上只是稍微重写了一下代码,但是在定义了函数之后,在实际代码中继续使用它看起来会更整洁一些。

mxg2im7a

mxg2im7a2#

使用替换操作符。不确定“漂亮”的度量是什么,但这应该很容易理解。

data <- tibble(value1 = 1:100, value2 = 101:200)
rowCt <- NROW(data)

data[sample(rowCt, 0.2*rowCt), "value1"] <- NA
data[sample(rowCt, 0.1*rowCt), "value2"] <- NA

虽然我并不认为您的方法“不漂亮”,但使用随机数生成器可能无法准确地给予目标比例,尤其是在小数据集上(不确定这是否是一个问题)。
如果您真的选择了tidy版本:

data |> 
  mutate(
    value1 = if_else(row_number() %in% sample(n(), 0.2*n()), NA_integer_, value1),
    value2 = if_else(row_number() %in% sample(n(), 0.1*n()), NA_integer_, value2)
  )

就我个人而言,如果我是第一次阅读代码,我会发现很难理解tidy版本中的内容

相关问题