【问题标题】:randomly replacing percentage of values per group with NA in R dataframe在 R 数据框中用 NA 随机替换每组值的百分比
【发布时间】:2021-01-10 01:38:34
【问题描述】:

我有一个具有不同大小的不同组 (ID) 的数据框。在每个组中,我想用 NA 随机替换“值”列中特定百分比的值(比如说 30%)。这是我的数据的简化版本:

ID<-rep(c("X1","X2"),times=c(3,6))
value<-c(1,2,3,1,2,3,4,5,6)
df1 <- data.frame(ID,value)
df1
ID value
X1     1
X1     2
X1     3
X2     1
X2     2
X2     3
X2     4
X2     5
X2     6

这是我想要的:

ID value
X1     1
X1     NA
X1     3
X2     1
X2     2
X2     NA
X2     4
X2     5
X2     NA

知道我该怎么做吗?我偏爱使用 tidyverse,但如果您有其他选择,我将不胜感激!

【问题讨论】:

    标签: r dataframe random replace na


    【解决方案1】:

    您可以使用sample() 获取数据的随机索引。

    你可以试试这个

    df <- data.frame(ID = paste("X", 1:10),
                     value = rnorm(10))
    
    fraction <- 0.30
    
    df$value[sample(1:length(df$value), size = round(length(df$value) * fraction))] <- NA
    
    #30% of the values in df$value will then be NA
    

    【讨论】:

      【解决方案2】:

      我们可以使用dplyr。按“ID”分组,使用sample 获取索引或30% 的行,并在replace 中使用它来将“值”替换为NA

      library(dplyr)
      df1 %>%
          group_by(ID) %>%
          mutate(value =  replace(value, sample(row_number(),  
                 size = ceiling(0.3 * n()), replace = FALSE), NA) )
      # A tibble: 9 x 2
      # Groups:   ID [2]
      #  ID    value
      #  <chr> <dbl>
      #1 X1       NA
      #2 X1        2
      #3 X1        3
      #4 X2       NA
      #5 X2        2
      #6 X2       NA
      #7 X2        4
      #8 X2        5
      #9 X2        6
      

      【讨论】:

      • 您好,我无法使用您的答案。当我运行此代码时,我收到以下错误:“n()` 只能在 dplyr 动词中使用。”。知道这是从哪里来的吗?
      • @Cam 在这里,n()dplyr 语法中使用,即。在mutate。不确定该错误是如何弹出的?你能显示packageVersion('dplyr')
      • @Cam 您的输入代码有一些拼写错误。我刚刚编辑了你帖子中的那些。现在可以测试了吗
      • 它的版本是 1.0.1!我现在会尝试测试它。
      • 是的,就是这样!开始一个新的会话就可以了。非常感谢!!
      【解决方案3】:

      假设数据在df中

      df[sample(seq(nrow(df)), nrow(df) *0.3), "value"] <- NA
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-07
        • 2021-11-08
        • 1970-01-01
        • 2011-12-31
        • 2022-01-23
        • 2022-01-20
        • 2012-09-16
        • 1970-01-01
        相关资源
        最近更新 更多