r语言 - 使用合并其他列中的条目的公式在数据框中添加新列



我有一个数据框"值",其条目如下:

     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

最新更新