我有一个数据帧,其中有一列类别和一列值(假设是"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但它需要几个小时才能跑完。有没有最快的方法呢?
谢谢!
发布于 2015-10-29 06:20:41
您可以使用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值。
发布于 2015-10-29 06:30:46
可以将data.table包与每个组的内联定义一起使用,如下所示
library('data.table')
DT <- DT[,
new := (Value - min(Value))/min(Value),
by = 'Cat_1'
]https://stackoverflow.com/questions/33402490
复制相似问题