R数据框用随机样本数据填充命名列

Posted

技术标签:

【中文标题】R数据框用随机样本数据填充命名列【英文标题】:R dataframe filling named columns with random sample data 【发布时间】:2021-10-04 18:04:33 【问题描述】:

我正在尝试为其他程序生成大量测试数据。 在 R Studio 中工作,我导入了一个 SPSS sav 文件,该文件包含 73 个变量以及其中记录的值和标签,使用 Haven 作为数据框“td”。这为我提供了我需要使用的所有变量名称。然后我删除所有现有数据。

td <- td[0,]

然后我通过加载索引 ID 生成 10,000 个测试数据行

td$ID <- 12340000:12349999

到目前为止一切顺利。

我有一个常量叫ThismanyRows <- 10000 我在一个名为 BinaryVariables 的变量中有大量列标题名称 还有一个有效值向量,称为CheckedOrNot <- c(NA, 1)

这就是问题所在:

td[,BinaryVariables] <- sample(x = CheckedOrNot, size= ThismanyRows, replace = TRUE)

确实用数据填充所有列。但它都是完全相同的数据,这不是我想要的。 我希望示例函数针对每一列运行,但不是每一列中的每个值。

即使

Fillbinary <- function () sample(x = CheckedOrNot, size= ThismanyRows, replace = TRUE)

td <- lapply(td[,BinaryVariables],Fillbinary) 生成:FUN(X[[i]], ...) 中的错误:未使用的参数 (X[[i]])

到目前为止,我还无法弄清楚如何将每一列作为一列处理并将示例函数应用于它。

非常感谢任何帮助。

【问题讨论】:

您正在生成 10 个值并将其输入以替换 3 * 10 个值。将您的样本调整为size=ThismanyRows*length(BinaryVariables) 【参考方案1】:

让我们先为示例生成一些假数据:

BinaryVariables <- c("v1","v2","v3")
CheckedOrNot <- c(NA, 1)
ThismanyRows <- 10

td <- data.frame(ID=1:10)

问题是您正在生成 10 个值并将其输入以替换 3 * 10 个值。

有几种方法可以解决这个问题。你可能一开始会想,好吧,我会生成 10 个值 3 次,如下所示:

td[BinaryVariables] <-  replicate(length(BinaryVariables),
                          sample(x = CheckedOrNot, size=ThismanyRows, replace=TRUE),
                        simplify=FALSE)

这会很好,但是如果你可以sample 一次并填写一次,为什么要sample 3 次?

td[BinaryVariables] <- sample(x = CheckedOrNot, 
                              size=ThismanyRows*length(BinaryVariables), replace = TRUE)

而且(嗯,a)结果表明每一列的值都不一样:

#   TD v1 v2 v3
#1   1 NA  1  1
#2   2 NA  1  1
#3   3 NA  1 NA
#4   4 NA  1 NA
#5   5  1 NA  1
#6   6 NA  1  1
#7   7  1 NA  1
#8   8  1  1 NA
#9   9  1 NA NA
#10 10  1 NA NA

【讨论】:

@PeterKing - 你为什么要循环列名来应用一个不使用列名的函数(因此你有一个未使用的参数的错误)?我想你想要replicate(length(BinaryVariables), Fillbinary(), simplify=FALSE) @PeterKing - 你的问题可以重新定义为 - 我如何复制函数 n 列的结果来替换 n 列?我的意思是,你可以完全按照你的要求和lapply(BinaryVariables, function(x) sample(CheckedOrNot, size= ThismanyRows, replace = TRUE)) 做,定义一个永远不会使用x 参数的函数,但这只是令人困惑。 请注意:td[BinaryVariables] sample(x = CheckedOrNot, size = ThismanyRows * length(td), replace = TRUE) 必须与现有的兼容数据。 x 现有数据有 10000 行。 x 分配的数据有 730000 行。 i 只有大小为 1 的向量被回收。运行rlang::last_error() 以查看错误发生的位置。 lapply 解决方案正常工作,复制版本也很高兴接受答案正文中的任何一个作为解决方案,尽管我认为 lapply 版本更接近我正在寻找的内容。谢谢。 对我来说很好。您使用的是 tibble 还是普通的旧 data.frame?我怀疑 tibble 因为它返回 tidyverse (rlang) 错误。

以上是关于R数据框用随机样本数据填充命名列的主要内容,如果未能解决你的问题,请参考以下文章

从 R 中的大型 .CSV 导入和提取随机样本

从R中的大型.CSV导入和提取随机样本

重命名 R 中的一个命名列

在 R 中的聚合中命名列

r语言随机森林结果规则怎么显示

R语言数据分析|随机森林