我遇到了一些麻烦,无法找到在闪亮应用中对我的数据执行少量计算的最佳和最有效的方法。我想首先计算所有列(除了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
感谢您的帮助!
答案 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)