gpt4 book ai didi

r - 在 R 数据框中按组应用计算

转载 作者:行者123 更新时间:2023-12-04 09:43:26 24 4
gpt4 key购买 nike

我有这样的数据:

object category country
495647 1 RUS
477462 2 GER
431567 3 USA
449136 1 RUS
367260 1 USA
495649 1 RUS
477461 2 GER
431562 3 USA
449133 2 RUS
367264 2 USA
...

其中一个对象出现在各种(category, country) 对中,并且国家/地区共享一个类别列表。

我想在其中添加另一列,这将是每个国家/地区的类别权重 - 出现在某个类别的类别中的对象数量,归一化为在一个国家/地区内总和为 1(仅对唯一 (category, country) 对)。

我可以这样做:

aggregate(df$object, list(df$category, df$country), length)

然后从那里计算权重,但是直接在原始数据上执行此操作的更有效和优雅的方法是什么。

期望的示例输出:

object category country weight
495647 1 RUS .75
477462 2 GER .5
431567 3 USA .5
449136 1 RUS .75
367260 1 USA .25
495649 1 RUS .75
477461 3 GER .5
431562 3 USA .5
449133 2 RUS .25
367264 2 USA .25
...

对于唯一的 (category, country) 对,以上内容将在国家/地区内加起来。

最佳答案

具体回答最后一句话:“直接在原始数据上执行此操作的更有效和优雅的方法是什么。”,恰好 data.table为此有一个新功能。

install.packages("data.table", repos="http://R-Forge.R-project.org")
# Needs version 1.8.1 from R-Forge. Soon to be released to CRAN.

DT 中的数据:

> DT[, countcat:=.N, by=list(country,category)]     # add 'countcat' column
category country countcat
1: 1 RUS 3
2: 2 GER 1
3: 3 USA 2
4: 1 RUS 3
5: 1 USA 1
6: 1 RUS 3
7: 3 GER 1
8: 3 USA 2
9: 2 RUS 1
10: 2 USA 1

> DT[, weight:=countcat/.N, by=country] # add 'weight' column
category country countcat weight
1: 1 RUS 3 0.75
2: 2 GER 1 0.50
3: 3 USA 2 0.50
4: 1 RUS 3 0.75
5: 1 USA 1 0.25
6: 1 RUS 3 0.75
7: 3 GER 1 0.50
8: 3 USA 2 0.50
9: 2 RUS 1 0.25
10: 2 USA 1 0.25

:= 通过引用数据添加一列,这是一项“旧”功能。新功能是它现在可以按组工作。 .N 是一个符号,保存每组中的行数。

这些操作是内存高效的,应该可以扩展到大数据;例如,1e81e9 行。

如果您不想包含中间列 countcat,只需在之后将其删除即可。同样,这是一种高效的操作,无论表的大小如何(通过在内部移动指针)都能立即运行。

> DT[,countcat:=NULL]     # remove 'countcat' column
category country weight
1: 1 RUS 0.75
2: 2 GER 0.50
3: 3 USA 0.50
4: 1 RUS 0.75
5: 1 USA 0.25
6: 1 RUS 0.75
7: 3 GER 0.50
8: 3 USA 0.50
9: 2 RUS 0.25
10: 2 USA 0.25
>

关于r - 在 R 数据框中按组应用计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11081535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com