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