我有一个数据框"值",其条目如下:
Test1 Test2 Test3
Power1 20 30 40
Power2 10 15 13
Max_Power1 30 50 90
Max_Power2 50 80 40
Voltage1 1.2 1.2 1.2
Voltage2 1.3 1.3 1.3
Current1 1.0 1.2 1.3
Current2 2.0 2.1 2.2
我需要创建一个包含以下内容的新列:
第 1 行的平均值
第 2 行的平均值
第 3 行的最大值
第 4 行的最大值
第 5 行的平均值
第 6 行的平均值
第 7 行的最小值
第 8 行的最小值
除了将其创建为具有一列的单独数据框,单独设置每个行条目,然后导入到原始数据框中之外,我不知道使用单个逗号执行此操作的方法。
建议不胜感激。
使用末尾注释中给出的test
创建一个函数名称向量,fun
,并将每个函数mapply
到相应的行:
avg <- mean
fun <- c("avg", "avg", "max", "max", "avg", "avg", "min", "min")
n <- nrow(test)
rows <- split(as.matrix(test), 1:n)
transform(test, Value = mapply(function(fun, x) match.fun(fun)(x), fun, rows), Stat = fun)
给:
Test1 Test2 Test3 Value Stat
Power1 20.0 30.0 40.0 30.00000 avg
Power2 10.0 15.0 13.0 12.66667 avg
Max_Power1 30.0 50.0 90.0 90.00000 max
Max_Power2 50.0 80.0 40.0 80.00000 max
Voltage1 1.2 1.2 1.2 1.20000 avg
Voltage2 1.3 1.3 1.3 1.30000 avg
Current1 1.0 1.2 1.3 1.00000 min
Current2 2.0 2.1 2.2 2.00000 min
也许另一种可能性是简单地计算每行的最小值、平均值和最大值。
stats <- function(x) c(Min = min(x), Avg = mean(x), Max = max(x))
cbind(test, t(apply(test, 1, stats)))
给:
Test1 Test2 Test3 Min Avg Max
Power1 20.0 30.0 40.0 20.0 30.000000 40.0
Power2 10.0 15.0 13.0 10.0 12.666667 15.0
Max_Power1 30.0 50.0 90.0 30.0 56.666667 90.0
Max_Power2 50.0 80.0 40.0 40.0 56.666667 80.0
Voltage1 1.2 1.2 1.2 1.2 1.200000 1.2
Voltage2 1.3 1.3 1.3 1.3 1.300000 1.3
Current1 1.0 1.2 1.3 1.0 1.166667 1.3
Current2 2.0 2.1 2.2 2.0 2.100000 2.2
注意
我们假设test
是:
test <- structure(list(Test1 = c(20, 10, 30, 50, 1.2, 1.3, 1, 2),
Test2 = c(30, 15, 50, 80, 1.2, 1.3, 1.2, 2.1), Test3 = c(40, 13, 90, 40, 1.2,
1.3, 1.3, 2.2)), .Names = c("Test1", "Test2", "Test3"),
class = "data.frame", row.names = c("Power1",
"Power2", "Max_Power1", "Max_Power2", "Voltage1", "Voltage2", "Current1", "Current2"))
这个问题的异常之处在于我们需要计算一些通常不会在行上计算的统计信息。有很多方法可以解决这个问题。
首先,我们可以使用 rpgm
包及其rowMins()
和rowMaxs()
函数来增强base:rowMeans()
.请注意,我们只想在第 2 - 4 列上进行计算,因为 Measurement 列不是数字。
rawData <- "Measurement Test1 Test2 Test3
Power1 20 30 40
Power2 10 15 13
Max_Power1 30 50 90
Max_Power2 50 80 40
Voltage1 1.2 1.2 1.2
Voltage2 1.3 1.3 1.3
Current1 1.0 1.2 1.3
Current2 2.0 2.1 2.2"
data <- read.table(text=rawData,header=TRUE,stringsAsFactors=FALSE)
# use rpgm package
library(rpgm)
rowMaxs(data[3:4,2:4])
rowMeans(data[c(1:2,5:6),2:4])
rowMins(data[7:8,2:4])
。和输出:
> library(rpgm)
> rowMaxs(data[3:4,2:4])
[1] 90 80
> rowMeans(data[c(1:2,5:6),2:4])
1 2 5 6
30.00000 12.66667 1.20000 1.30000
> rowMins(data[7:8,2:4])
[1] 1 2
另一种选择是使用 reshape2
包重塑数据,以便我们可以计算列而不是行的统计信息。
library(reshape2)
data <- read.table(text=rawData,header=TRUE,stringsAsFactors=FALSE)
data2 <- melt(data,id=c("Measurement"))
data3 <- dcast(data2,variable ~ Measurement)
colMeans(data3[,6:9])
colMins(data3[,2:3])
colMaxs(data3[,4:5])
。和输出:
> library(reshape2)
> data <- read.table(text=rawData,header=TRUE,stringsAsFactors=FALSE)
> data2 <- melt(data,id=c("Measurement"))
> data3 <- dcast(data2,variable ~ Measurement)
> colMeans(data3[,6:9])
Power1 Power2 Voltage1 Voltage2
30.00000 12.66667 1.20000 1.30000
> colMins(data3[,2:3])
[1] 1 2
> colMaxs(data3[,4:5])
[1] 90 80