有没有更有效的方法在数据框中生成频率列

Is there a more efficient way to generate a frequency column in a data frame

我正在 运行ning KNN 跨越包含一些分类器的数据集,我想根据两列是它们的概率将其转换为数值。

是否有更有效的方法来衡量 A 列相对于 B 列出现的概率并将其作为新列包含在数据框中?

尝试 运行 as.data.frame(prop.table... 时出现错误:

Error: cannot allocate vector of size 4.0 Gb

我目前的做法是:

df <- read.table(text="
Animal  Colour  Age
Cat Black 3
Cat White 14
Cat Black 5
Cat Black 2
Cat Brown 7
Dog Black 3
Dog Brown 3
Dog Brown 2
Mouse White 1
Rabbit White  4
Rabbit Black  2
Rabbit Brown  3",
header=T)

ptdf <- as.data.frame(prop.table(table(df$Animal, df$Colour), 1))

df$AnimalColourFrequency = subset(ptdf, Var1==df$Animal & Var2==df$Colour)$Freq

供参考:A 列有 9000 多个唯一值,B 列有大约 34K 个值,数据集有 850 万行。

尝试使用 dplyr 方式提高效率:

df2 <- df %>% 
  count(Animal, Colour) %>% 
  group_by(Animal) %>% 
  mutate(prop=n / sum(n))
# Animal Colour     n  prop
# <chr>  <chr>  <int> <dbl>
#   1 Cat    Black      3 0.6  
# 2 Cat    Brown      1 0.2  
# 3 Cat    White      1 0.2  
# 4 Dog    Black      1 0.333
# 5 Dog    Brown      2 0.667
# 6 Mouse  White      1 1    
# 7 Rabbit Black      1 0.333
# 8 Rabbit Brown      1 0.333
# 9 Rabbit White      1 0.333

df %>% inner_join(df2)

如果不行,还有data.table

你可以试试 data.table :

library(data.table)
setDT(df)
df[, .N, .(Animal, Colour)][, Freq := prop.table(N), Animal][]

#   Animal Colour N      Freq
#1:    Cat  Black 3 0.6000000
#2:    Cat  White 1 0.2000000
#3:    Cat  Brown 1 0.2000000
#4:    Dog  Black 1 0.3333333
#5:    Dog  Brown 2 0.6666667
#6:  Mouse  White 1 1.0000000
#7: Rabbit  White 1 0.3333333
#8: Rabbit  Black 1 0.3333333
#9: Rabbit  Brown 1 0.3333333