我有一个数据框"值"条目如下:
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行的最小值
如果没有将其创建为具有一列的单独数据框,单独设置每个行条目然后导入到原始数据框中,我不知道如何使用单个命令执行此操作。
建议表示赞赏。
答案 0 :(得分:3)
使用末尾注释中给出的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"))
答案 1 :(得分:1)
这个问题的异常是我们需要计算一些通常不在行上计算的统计数据。有很多方法可以解决这个问题。
首先,我们可以使用rpgm
包及其rowMins()
和rowMaxs()
函数来扩充base:rowMeans()
。请注意,我们只想计算第2列,因为“测量”列不是数字。
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