【问题标题】:In R, how do I create multiple vectors of random values based on values from a data frame?在 R 中,如何根据数据帧中的值创建多个随机值向量?
【发布时间】:2018-02-11 23:19:13
【问题描述】:

我有一个数据框 rT,它可以有任意数量的列和行。

            A      B      C      D
1      69.581 62.633 59.953 59.861
2      70.118 62.705 60.171 60.126
3      71.031 62.832 60.623 60.666
4      71.684 62.998 61.191 61.256
5      72.306 63.215 61.810 61.882
6      72.850 63.411 62.447 62.470
7      73.330 63.652 63.081 63.060
8      73.750 63.919 63.660 63.679

我想生成一个新的数据框 delT,它具有与 rT 相同的列数(也具有相同的列标题),有 n 行,其中每列是随机且统一的,并且每列的最小值为delT 基于 rT 对应列的最小值和最大值。 rT 的最小值和最大值不一定在每列的第一行和最后一行。

例如,使用 runif:

runif(n, min = max(x) - min(x), max = 100)

其中 x 是 rT 的相应列。对于 delT 的 A 列(基于 rT 的 A 列),runif 的 max(x) = 73.750 和 min(x) = 69.581。

我试过把它放在一个函数中并使用apply,但不能让它工作。

【问题讨论】:

    标签: r


    【解决方案1】:

    看起来很简单。在lapply 循环中使用您的runif 调用。

    n <- 8
    delT <- lapply(rT, function(x) runif(n, min = max(x) - min(x), max = 100))
    delT <- as.data.frame(delT)
    

    数据:

    rT <-
    structure(list(A = c(69.581, 70.118, 71.031, 71.684, 72.306, 
    72.85, 73.33, 73.75), B = c(62.633, 62.705, 62.832, 62.998, 63.215, 
    63.411, 63.652, 63.919), C = c(59.953, 60.171, 60.623, 61.191, 
    61.81, 62.447, 63.081, 63.66), D = c(59.861, 60.126, 60.666, 
    61.256, 61.882, 62.47, 63.06, 63.679)), .Names = c("A", "B", 
    "C", "D"), class = "data.frame", row.names = c("1", "2", "3", 
    "4", "5", "6", "7", "8"))
    

    【讨论】:

    • 我认为我遗漏了一些明显的东西。您和 ycw 几乎同时提供了相同的答案。
    【解决方案2】:

    我们可以使用lapply将你设计的函数应用到每一列,然后使用as.data.frame将列表转换为数据框。这里我以n = 10为例,生成了一个10行的数据框。 rt2 是最终输出。

    # Set the seed for reproducibility
    set.seed(123)
    
    rt2 <- as.data.frame(
      lapply(rt, function(x){
        # Set the number of rows in the first argument
        runif(10, min = max(x) - min(x), max = 100)  
    }))
    
    rt2
               A         B        C         D
    1  31.727841 95.738847 89.36341 96.443597
    2  79.713069 46.036428 70.41912 90.602927
    3  43.361667 68.171708 65.38332 70.251415
    4  88.789441 57.812934 99.44822 80.327647
    5  94.294920 11.446107 66.84688  6.185393
    6   8.534725 90.111322 71.93352 49.773372
    7  54.777877 25.578305 56.09675 76.768155
    8  89.690409  5.437865 60.91872 24.632548
    9  57.013569 33.656366 31.55106 34.421286
    10 47.926847 95.508873 17.87301 26.096231
    

    数据

    rt <- read.table(text = "            A      B      C      D
    1      69.581 62.633 59.953 59.861
                     2      70.118 62.705 60.171 60.126
                     3      71.031 62.832 60.623 60.666
                     4      71.684 62.998 61.191 61.256
                     5      72.306 63.215 61.810 61.882
                     6      72.850 63.411 62.447 62.470
                     7      73.330 63.652 63.081 63.060
                     8      73.750 63.919 63.660 63.679",
                     header = TRUE)
    

    【讨论】:

      【解决方案3】:

      使用tidyverse 及其purrr 包,您可以根据data.frame 的每一列应用一个函数。然后,当您获得与函数相同长度的向量时,您可以再次将结果绑定到 data.frame 中。

      purrr::map 允许您遍历列表,因此遍历 data.frame 的列。对于每一列,应用函数~runif(n, min = max(.x)-min(.x), max = 100)。由于每个结果的长度为n,我们可以将它们绑定在一起。 map_dfc 用于使用 map 并给出一个列绑定 data.frame 作为结果。


      rT <- data.frame(
        A = c(69.581, 70.118, 71.031, 71.684, 72.306,
              72.85, 73.33, 73.75),
        B = c(62.633, 62.705, 62.832, 62.998, 63.215,
              63.411, 63.652, 63.919),
        C = c(59.953, 60.171, 60.623, 61.191,
              61.81, 62.447, 63.081, 63.66),
        D = c(59.861, 60.126, 60.666,
              61.256, 61.882, 62.47, 63.06, 63.679)
        )
      library(purrr)
      n <- 5
      rT %>%
        map_dfc(~runif(n, min = max(.x)-min(.x), max = 100))
      #> # A tibble: 5 x 4
      #>           A        B         C        D
      #>       <dbl>    <dbl>     <dbl>    <dbl>
      #> 1  5.954893 52.99178 35.314039 88.06139
      #> 2 75.256292 11.50050 17.731318 92.13357
      #> 3 10.511348 15.13069 90.662412 91.01179
      #> 4 44.521538 98.34528 27.756598 53.75294
      #> 5 27.128326 94.98931  6.512121 59.73266
      n <- 10
      rT %>%
        map_dfc(~runif(n, min = max(.x)-min(.x), max = 100))
      #> # A tibble: 10 x 4
      #>            A         B         C        D
      #>        <dbl>     <dbl>     <dbl>    <dbl>
      #>  1 72.906857 71.907060 17.426403 66.71158
      #>  2 16.310144 77.950989 57.590292 20.20146
      #>  3 69.083519 83.131703 18.149709 88.18446
      #>  4 27.283926  3.569011  7.818614 61.14583
      #>  5 49.978554 45.326009 70.542656 20.57136
      #>  6 23.625139 87.162790 69.688542 94.57557
      #>  7 84.301649 53.648099 54.296879 78.02967
      #>  8  9.086232 97.715472 61.867758 93.03181
      #>  9 14.799283 64.542723 75.905285 82.73306
      #> 10 18.165695 50.796225 12.418779 34.12631
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-26
        • 1970-01-01
        • 1970-01-01
        • 2014-08-05
        • 1970-01-01
        • 2022-01-20
        相关资源
        最近更新 更多