当前位置: 首页 > 知识库问答 >
问题:

在 R 中,如何基于数据框中的值创建多个随机值向量?

翟承志
2023-03-14

我有一个数据帧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。

我试过将其放入函数并使用应用程序,但无法使其工作。

共有3个答案

游勇军
2023-03-14
匿名用户

使用< code>tidyverse及其< code>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

曾骁
2023-03-14

我们可以使用l

# 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)

蒋弘致
2023-03-14

似乎很简单。在< code>lapply循环中使用您的< code>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"))
 类似资料:
  • 本文向大家介绍如何在R中创建具有随机值的矩阵?,包括了如何在R中创建具有随机值的矩阵?的使用技巧和注意事项,需要的朋友参考一下 通常,使用给定值创建矩阵,但是如果我们要创建具有随机值的矩阵,则将对矩阵函数使用常规方法。R中的随机选择可以根据我们的目标以多种方式完成,例如,如果要从正态分布中随机选择值,则将使用rnorm函数并将其存储在矩阵中,然后将其传递到矩阵函数中。 示例 输出结果 示例 输出结

  • 我有两个pyspark数据帧 DF1 : df2: 我想向df1添加一个列Location_Id,从df2获取匹配的Id,如下所示: 我如何才能做到这一点?

  • 本文向大家介绍如何随机化R中已经创建的向量?,包括了如何随机化R中已经创建的向量?的使用技巧和注意事项,需要的朋友参考一下 有些向量是在R中随机创建的,而有些不是在R中随机创建的,但是我们可以对这两种类型的向量进行随机化处理。随机化可确保无偏性,因此,特别是在创建具有易于改变分析结果的目标的矢量时,这是必要的。R中的随机化可以简单地借助样本函数完成。 不是随机创建的向量的随机化- 随机创建的向量的

  • 本文向大家介绍如何基于R中的data.table的组列创建随机样本?,包括了如何基于R中的data.table的组列创建随机样本?的使用技巧和注意事项,需要的朋友参考一下 随机抽样有助于我们减少分析中的偏差。如果我们有分组数据,那么我们可能想根据分组找到随机样本。例如,如果我们有一个带有组变量的数据框,并且每个组包含十个值,那么我们可能想要创建一个随机样本,在该样本中,将从每个组中随机选择两个值。

  • 我有一张800万行的大桌子。此表有15列带有数值,但这些值只能是0,并且只能是该列特有的另一个数值。我想根据特定值为这些列中的每一列创建两个新列。这些新值总是特定于列。 这是我的数据外观的虚拟示例: 这是我想要的输出 对应关系始终相同,即中1的值为,中2的值为,中3的值为。 我知道我可以用这样的东西 但我的真实数据有15列,需要大量的复制粘贴,有没有干净的方法?

  • 本文向大家介绍如何在R中创建具有重复值的向量?,包括了如何在R中创建具有重复值的向量?的使用技巧和注意事项,需要的朋友参考一下 有两种方法可以创建一个在R中具有重复值的向量,但是两种方法都有不同的方法,第一种方法是重复向量的每个元素,第二种方法将元素重复指定的次数。这两种方法都使用rep函数来创建向量。 示例 请看以下示例-