【问题标题】:R: How to convert from loops and rbinds to efficient code?R:如何从循环和 rbind 转换为高效代码?
【发布时间】:2014-07-24 12:57:17
【问题描述】:

我是 R 新手。我有一个问题要解决,下面的一个工作函数可以很好地解决它(在适当的时候)。但是,从我在 R 教程和 SO 上阅读的内容来看,我觉得我正在做太多的工作来解决它。有没有一些花哨的 R 方法可以将这一切折叠成几行?

要解决的问题:给定一个字符数据的 CSV 文件和一个“标志”参数,提取位置 [row, 1] 处的值。 “行”计算为“标志 a”的“InterestingColumn”列中的最小值,“标志 b”的“有趣列”列中的最大值,或由数字“标志”定义的第 n 个值。输出应按“InterestingColumn”的唯一值分组。返回的结果应该是一个数据框。列架构已知,但文件长度未知。

我的直觉是我应该能够完全摆脱 for 循环,而且我每次使用 rbind 重建矩阵效率低下 (like this?) 任何指导将不胜感激,谢谢!

myfunc <- function(flag = "a") {
   csv <- read.csv("data.csv", colClasses = "character")
   col <- unique(csv$InterestingColumn)
   output <- NULL

   for (i in 1:length(col)) {
      sub <- subset(csv, InterestingColumn == col[i])
      vals <- as.numeric(sub[, 12])

      if (flag == "a") {
         output <- rbind(output, matrix(c(sub[which.min(vals),1], col[i]), ncol = 2))
      }
      else if (flag == "b") {
         output <- rbind(output, matrix(c(sub[which.max(vals),1], col[i]), ncol = 2))
      }
      else if (is.numeric(flag)) {
         output <- rbind(output, matrix(c(sub[flag,1], col[i]), ncol = 2))
      }

      colnames(output) <- c("data", "col")
      as.data.frame(output)
   }
}

【问题讨论】:

  • 如果您有示例输入和预期输出会有所帮助。
  • 抱歉,InterestingColumn 不是第 12 列,这是一个错字。

标签: r loops csv matrix rbind


【解决方案1】:

假设第 12 列名为 Col12。那么aggregate 可能就可以了。函数中read.csv 调用之后的所有内容都应由以下表达式处理(但您可能需要设置结果数据框的名称):

aggregate(Col12 ~ InterestingColumn, data=csv, FUN=function(x) {
  if (flag == "a") {
    min(x);
  } else if (flag == "b") {
    max(x);
  } else if (is.numeric(flag)) {
    x[flag];
  }
})

【讨论】:

  • 谢谢这是一个有趣的建议,我会试试看。你是正确的,InterestingColumn 不是 12,那是我的错字。
  • 聚合函数绝对可以为 x 提取正确的值。但是,我正在努力获取我需要的下一组数据。一旦我为给定的 InterestingColumn 获得了正确的 Col12 值,我需要为我的最终输出提取第三列数据。我实际上并不关心输出的 Col12 的值,只计算。有没有办法将另一列带入聚合内?
  • 我可以再次在 csv 中搜索聚合函数产生的行,然后提取我的列,但这似乎会扼杀任何性能提升。
猜你喜欢
  • 2019-04-27
  • 2023-01-22
  • 1970-01-01
  • 2016-02-01
  • 2021-10-22
  • 2014-03-12
  • 2019-12-09
  • 1970-01-01
  • 2020-12-02
相关资源
最近更新 更多