我有一个包含一列类别和一列有价值的数据框(让我们说" v")。我需要创建一个具有以下值的新列:v - min(v)/ min(v)。例如:
Cat 1 | Value
A | 1
A | 3
B | 2
B | 1
必须:
Cat 1 | Value | NewCol
A | 1 | (1-1)/1 = 0
A | 3 | (3-1)/1 = 2
B | 4 | (4-2)/2 = 1
B | 2 | (2-2)/2 = 0
我使用以下代码:
for (i in unique(fullDataset$Cat)) {
fullDataset[which(fullDataset$Cat==i),"NewCol"] = min(fullDataset[which(fullDataset$Cat==i),"Value"])
}
fullDataset$NewCol <- (fullDataset$Value - fullDataset$NewCol) / fullDataset$NewCol
但它需要花费数小时才能运行......有最快的方法吗?
谢谢!
答案 0 :(得分:1)
您可以使用dplyr
:
library(dplyr)
fullDataset %>% group_by(Cat) %>%
mutate(newcol = (Value - min(Value))/min(Value))
Source: local data frame [4 x 3]
Groups: Cat [2]
Cat Value newcol
(fctr) (int) (int)
1 A 1 0
2 A 3 2
3 B 4 1
4 B 2 0
首先,我们按Cat
分组,然后mutate
分组新列newcol
,即值,减去min
值,除以最小值。
答案 1 :(得分:1)
您可以将data.table
包与每组的内联定义一起用作
library('data.table')
DT <- DT[,
new := (Value - min(Value))/min(Value),
by = 'Cat_1'
]