使用 dplyr 在 R 中使用 group_by 生成唯一/随机序列号

2024-04-05

我想使用 R 生成按某些列分组的唯一数字(序列或随机)。

下面提供了一个示例数据集

fact_code  style_         item             buyer
1206       -23            LADIES TANK TOP  652
1206       -23            LADIES TANK TOP  652
1206       -23            LADIES TANK TOP  652
1214       593935_592435  SS T-SHIRT       254
1214       593935_592435  SS T-SHIRT       254 
1214       593935_592435  SS T-SHIRT       254
7022       1572472        T-SHIRT          338
7022       1572472        T-SHIRT          338
7022       1572472        T-SHIRT          338

使用上面的数据,我想创建一个变量,例如,style_serial,如下所示:

fact_code  style_         item             buyer style_serial
1206       -23            LADIES TANK TOP  652   1
1206       -23            LADIES TANK TOP  652   1
1206       -23            LADIES TANK TOP  652   1   
1214       593935_592435  SS T-SHIRT       254   2
1214       593935_592435  SS T-SHIRT       254   2 
1214       593935_592435  SS T-SHIRT       254   2
7022       1572472        T-SHIRT          338   3
7022       1572472        T-SHIRT          338   3
7022       1572472        T-SHIRT          338   3

也就是说,创建一个变量,该变量采用按事实_代码、样式_、项目和买家列分组的唯一值。我已经尝试使用以下 R 代码dplyr包裹:

df <- df %>%
dplyr::group_by(fact_code, style_, buyer) %>%
dplyr::mutate(style_serial = 1:n())

where df是上述示例数据框的名称。但它给了我意想不到的输出:

fact_code  style_         item             buyer style_serial
1206       -23            LADIES TANK TOP  652   1
1206       -23            LADIES TANK TOP  652   2
1206       -23            LADIES TANK TOP  652   3   
1214       593935_592435  SS T-SHIRT       254   1
1214       593935_592435  SS T-SHIRT       254   2 
1214       593935_592435  SS T-SHIRT       254   3
7022       1572472        T-SHIRT          338   1
7022       1572472        T-SHIRT          338   2
7022       1572472        T-SHIRT          338   3

我不介意 style_serial 是否是随机的整数集,因此数据将如下所示:

fact_code  style_         item             buyer style_serial
1206       -23            LADIES TANK TOP  652   10
1206       -23            LADIES TANK TOP  652   10
1206       -23            LADIES TANK TOP  652   10   
1214       593935_592435  SS T-SHIRT       254   2
1214       593935_592435  SS T-SHIRT       254   2 
1214       593935_592435  SS T-SHIRT       254   2
7022       1572472        T-SHIRT          338   100
7022       1572472        T-SHIRT          338   100
7022       1572472        T-SHIRT          338   100

为了生成上表,我运行以下命令R code:

df <- df %>%
dplyr::group_by(fact_code, style_, buyer) %>%
dplyr::mutate(style_serial = sample(1:6000, n(), replace = FALSE))

但是,我无法获得所需的输出。

主要目标是在本例中创建一个变量 style_serial,它假定按一定数量的列分组的唯一值,即在本例中为fact_code、style_、item 和 Buyer。

任何帮助,将不胜感激。


我们可以用group_indices from dplyr

library(dplyr)
df %>%
   mutate(style_serial = sample(6000)[group_indices(.,fact_code, style_, buyer)])
# fact_code        style_            item buyer style_serial
#1      1206           -23 LADIES TANK TOP   652         5778
#2      1206           -23 LADIES TANK TOP   652         5778
#3      1206           -23 LADIES TANK TOP   652         5778
#4      1214 593935_592435      SS T-SHIRT   254          998
#5      1214 593935_592435      SS T-SHIRT   254          998
#6      1214 593935_592435      SS T-SHIRT   254          998
#7      7022       1572472         T-SHIRT   338         3018
#8      7022       1572472         T-SHIRT   338         3018
#9      7022       1572472         T-SHIRT   338         3018

注意:数字是random化为sample,如果我们不需要它,则删除sample part

df %>%
  mutate(style_serial = group_indices(.,fact_code, style_, buyer))

或者使用base R

v1 <- with(df, do.call(paste, df[1:3]))
df$style_serial <-  match(v1, unique(v1))

data

df <- structure(list(fact_code = c(1206L, 1206L, 1206L, 1214L, 1214L, 
1214L, 7022L, 7022L, 7022L), style_ = c("-23", "-23", "-23", 
"593935_592435", "593935_592435", "593935_592435", "1572472", 
"1572472", "1572472"), item = c("LADIES TANK TOP", "LADIES TANK TOP", 
"LADIES TANK TOP", "SS T-SHIRT", "SS T-SHIRT", "SS T-SHIRT", 
"T-SHIRT", "T-SHIRT", "T-SHIRT"), buyer = c(652L, 652L, 652L, 
254L, 254L, 254L, 338L, 338L, 338L)), class = "data.frame", row.names = c(NA, 
-9L))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 dplyr 在 R 中使用 group_by 生成唯一/随机序列号 的相关文章

随机推荐