1

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

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

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

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)
   }
}
4

1 回答 1

0

假设第 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];
  }
})
于 2014-06-04T02:31:06.650 回答