【问题标题】:How to select n random values from each rows of a dataframe in R?如何从 R 中数据帧的每一行中选择 n 个随机值?
【发布时间】:2021-10-12 11:34:37
【问题描述】:

我有一个数据框

df= data.frame(a=c(56,23,15,10),
              b=c(43,NA,90.7,30.5),
              c=c(12,7,10,2),
              d=c(1,2,3,4),
              e=c(NA,45,2,NA))

我想从每一行中选择两个随机的非 NA 行值并将其余的转换为 NA

必需的输出 - 由于随机性而不同

df= data.frame(
              a=c(56,NA,15,NA),
              b=c(43,NA,NA,NA),
              c=c(NA,7,NA,2),
              d=c(NA,NA,3,4),
              e=c(NA,45,NA,NA))

使用的代码
我知道从特定行中选择随机的非 NA 值

set.seed(2)
sample(which(!is.na(df[1,])),2)

但不知道如何应用所有数据帧并获得所需的输出

【问题讨论】:

标签: r dplyr


【解决方案1】:

您可以编写一个函数来保持n 随机值连续。

keep_n_value <- function(x, n) {
  x1 <- which(!is.na(x))
  x[-sample(x1, n)] <- NA
  x
}

使用base R逐行应用函数-

set.seed(123)
df[] <- t(apply(df, 1, keep_n_value, 2))
df
#   a    b  c  d  e
#1 NA   NA 12  1 NA
#2 NA   NA  7  2 NA
#3 NA 90.7 10 NA NA
#4 NA 30.5 NA  4 NA

或者如果你更喜欢tidyverse -

purrr::pmap_df(df, ~keep_n_value(c(...),  2))

【讨论】:

    【解决方案2】:

    基础 R:

    您可以尝试按列应用 (sapply) 并将两个非 NA 值随机替换为 NA,例如:

    as.data.frame(sapply(df, function(x) replace(x, sample(which(!is.na(x)), 2), NA)))
    

    示例输出:

       a    b  c  d  e
    1 56   NA 12 NA NA
    2 23   NA NA  2 NA
    3 NA   NA 10  3 NA
    4 NA 30.5 NA NA NA
    

    【讨论】:

    • 或者简单一点:df[] &lt;- lapply(df, ...)
    【解决方案3】:

    使用dplyrpurrr 的一个选项可能是:

    df %>%
        mutate(pmap_dfr(across(everything()), ~ `[<-`(c(...), !seq_along(c(...)) %in% sample(which(!is.na(c(...))), 2), NA)))
    
       a    b  c  d  e
    1 56 43.0 NA NA NA
    2 23   NA  7 NA NA
    3 15   NA NA NA  2
    4 NA 30.5  2 NA NA
    

    【讨论】:

      猜你喜欢
      • 2017-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-02
      • 2016-02-26
      • 2020-08-10
      • 1970-01-01
      相关资源
      最近更新 更多