使用组合其他列的条目的公式在数据框中添加新列

时间:2018-04-15 00:57:19

标签: r dataframe

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

     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行的最小值

如果没有将其创建为具有一列的单独数据框,单独设置每个行条目然后导入到原始数据框中,我不知道如何使用单个命令执行此操作。

建议表示赞赏。

2 个答案:

答案 0 :(得分:3)

使用末尾注释中给出的test创建一个函数名称向量,funmapply每个函数到相应的行:

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