r - 重复循环并在 R 中添加列
问题描述
我正在尝试构建一个 R 代码,它将占用我的循环并运行 20 次。每次我想在现有数据框中添加一列。在这里,我尝试了 3 次添加代码,但我觉得必须有一种更简单的方法来自动化它。我非常感谢任何帮助。
我的原始数据文件(称为“igel”)包含两列(“Year”和“Grid”)和 1096 行。通过循环,我从“网格”列中选择一个随机数,并检查它之前是否被选择过。如果是,则将 0 添加到新列,如果不是,则添加 1。
这里的代码:
a <- data.frame(matrix(ncol = 2, nrow = 0))
x <- c("number", "count")
colnames(a) <- x
for (i in 1:1096) {
num_i <- sample(igel$Grid, 1)
count_i <- c(if (num_i %in% a$number == TRUE) {0} else {1})
a<-a %>% add_row(number = num_i, count = count_i)
}
b <- data.frame(matrix(ncol = 2, nrow = 0))
x <- c("number", "count")
colnames(b) <- x
for (i in 1:1096) {
num_i <- sample(igel$Grid, 1)
count_i <- c(if (num_i %in% b$number == TRUE) {0} else {1})
b<-b %>% add_row(number = num_i, count = count_i)
}
c <- data.frame(matrix(ncol = 2, nrow = 0))
x <- c("number", "count")
colnames(c) <- x
for (i in 1:1096) {
num_i <- sample(igel$Grid, 1)
count_i <- c(if (num_i %in% c$number == TRUE) {0} else {1})
c<-c %>% add_row(number = num_i, count = count_i)
}
df.total<- cbind(a$count,b$count, c$count)
解决方案
考虑sapply
甚至它的包装器,replicate
并在向量计算中分别计算数量和计数,而不是逐行循环增长对象。
# RUNS 3 SAMPLES OF igel$Grid 1,096 TIMES (ADJUST 3 TO ANY POSITIVE INT LIKE 20)
grid_number <- data.frame(replicate(3, replicate(1096, sample(igel$Grid, 1))))
# RUNS ACROSS 3 COLUMNS TO CHECK CURRENT ROW VALUE IS INCLUDED FOR ALL VALUES BEFORE ROW
grid_count <- sapply(grid_number, function(col)
sapply(seq_along(col), function(i)
ifelse(col[i] %in% col[1:(i-1)], 0, 1)
)
)
虽然上面并没有完全重现您的输出df.total
(矩阵而不是数据框),但由于迭代中的随机采样,两者保持相似的结构:
dim(df.total)
# [1] 1096 3
dim(grid_count)
# [1] 1096 3
推荐阅读
- opayo - 以编程方式确定 Sagepay 卡详细信息表单是否不完整
- mysql - 在给定日期之前查找分数的存储过程
- r - 为 Ops 分组通用方法(用于时间序列)
- azure - 如何在 Azure Blob 存储中的容器中添加自定义列?
- wordpress - 在 word press 错误中导入应用程序
- c# - CsvHelper.Configuration.ClassMap 的动态分配属性
- nestjs - 有没有办法使用单个装饰器隐藏 controller.ts 中的所有端点?
- cmake - CMake - 自定义“制作帮助”输出
- javascript - FIREBASE 获取文档数据
- scala - 尝试使用 FLINK 从 s3 读取文件,使用 IDE 获取 Class org.apache.hadoop.fs.s3a.S3AFileSystem not found