R计算从一列到所有其他列

时间:2017-01-27 08:13:24

标签: r

我遇到了一些麻烦,无法找到在闪亮应用中对我的数据执行少量计算的最佳和最有效的方法。我想首先计算所有列(除了ID)到一列之间的差异,为每个列创建新列(具有特定名称),然后执行小计算。我将在示例数据上解释它:

data <- structure(list(ID = 1:2, Zeit600 = c(601.782608695652, 602.625
), Zeit650 = c(504.705882352941, 546.666666666667), Zeit700 = c(321.26582278481, 
                                                                316.666666666667), Zeit750 = c(264.303797468354, 261.111111111111
                                                                ), Zeit800 = c(207.341772151899, 205.555555555556)), row.names = c(NA, 
                                                                                                                                   -2L), .Names = c("ID", "Zeit600", "Zeit650", "Zeit700", "Zeit750", 
                                                                                                                                                    "Zeit800"), class = "data.frame")

以下表格中的相同数据更容易查看:

  ID  Zeit600  Zeit650  Zeit700  Zeit750  Zeit800
1  1 601.7826 504.7059 321.2658 264.3038 207.3418
2  2 602.6250 546.6667 316.6667 261.1111 205.5556

我想做的是:

1。计算所有列(ID除外)与名为Zeit800的列之间的差异,并将其命名(如果T800可能是Zeit旁边的数字)。

*我的原始数据在闪亮时具有反应性,因此列数Zeit...会有所不同,只有列Zeit800始终保持不变。

结果如下:

  ID  Zeit600  Zeit650  Zeit700  Zeit750  Zeit800 T800_T600 T800_T650 T800_T700 T800_T750
1  1 601.7826 504.7059 321.2658 264.3038 207.3418  394.4408  297.3641  113.9241  56.96203
2  2 602.6250 546.6667 316.6667 261.1111 205.5556  397.0694  341.1111  111.1111  55.55556

2。然后我想执行小计算,计算列名称中下一个Zeit...的800和数字之间的差值,并将其除以上面执行的计算值 1 T800...)。例如,我们为Zeit600的<{1}}列计算:

ID=1

整个数据框看起来像:

800-600/T800_600 = 800-600/394.4408 = 0.507

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

现在这是一个函数形式的整个操作:

myfun <- function(var, compvar, data) {
  diffcol <- as.data.frame(lapply(data[var], function(x) x-data[compvar]))
  names(diffcol) <- paste(compvar, var, sep = "_")
  mydata <- cbind(data, diffcol)

  abkuehlrate <- as.data.frame(mapply(function(x, y) 
    (as.numeric(gsub("T", "", compvar))-as.numeric(gsub("T", "", x)))/y, var, diffcol, SIMPLIFY = FALSE))
  names(abkuehlrate) <- paste("Abkuehlrate", compvar, gsub("T", "", var), sep = "_")
  mydata <- cbind(mydata, abkuehlrate)
  return(mydata)
}

您可以通过将变量作为其名称的字符串提供并提供数据来使用它:

mydf <- myfun("T600", "T800", mydf)

这样,您可以使用带有变量名称字符串的函数,您可以以任何方式从数据中提取这些变量名称。例如:

myvars <- names(mydf[,2:5])
newdf <- myfun(myvars, "T800", mydf)

输出:

> newdf
  ID     T600     T650     T700     T750     T800 T800_T600 T800_T650 T800_T700 T800_T750 Abkuehlrate_T800_T600
1  1 601.7826 504.7059 321.2658 264.3038 207.3418  394.4408  297.3641  113.9241  56.96203             0.5070469
2  2 602.6250 546.6667 316.6667 261.1111 205.5556  397.0694  341.1111  111.1111  55.55556             0.5036902

  Abkuehlrate_T800_T650 Abkuehlrate_T800_T700 Abkuehlrate_T800_T750
1             0.5044321             0.8777778             0.8777778
2             0.4397394             0.9000000             0.9000000

编辑:最终小编辑以获取您想要的确切变量名称。如果您的变量必须命名为Zeit600等,则只需将"Zeit"替换为"T"操作中的gsub()

答案 1 :(得分:2)

subData <- subset(data,select = - c(ID, Zeit800))
numbers <- as.numeric(gsub("\\D", "", names(subData)))
namesT <- paste0("T800_T",  numbers)
T800 <- subData-data$Zeit800
data[,namesT] <- T800
namesAbkuehlrate <- paste0("Abkuehlrate_T800_",  numbers)
data[,namesAbkuehlrate] <- mapply('/', (800-numbers), T800)