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数据框用随机样本数据填充命名列的主要内容,如果未能解决你的问题,请参考以下文章