有没有更有效的方法在数据框中生成频率列
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
我正在 运行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