在R中,如何根据数据帧中的值创建多个随机值向量?

时间:2017-09-03 15:14:55

标签: r

我有一个数据框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,但无法使其正常工作。

3 个答案:

答案 0 :(得分:2)

似乎很简单。在runif循环中使用lapply来电。

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

答案 1 :(得分:1)

我们可以使用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)

答案 2 :(得分:1)

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

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


map