如何将数字标识符列表添加到 R 中的数据框?

How can a list of numerical identifiers be added to a dataframe in R?

您好,欢迎来到我的问题。

我想创建一个基于位置的唯一数字标识符列表,以表示项目在数据框中一列值中的位置。

这是我想要的示例(在 Position 列中):

tibble(Fruit = c(rep("Apple", 3), rep("Pear", 2), rep("Orange", 4)),
       Variety = c("Gala", "Envy", "Pink Lady", "Anjou", "Bartlett", "Blood", "Seville", "Mandarin", "Bergamot"),
       Position = c(1.1, 1.2, 1.3, 2.1, 2.2, 3.1, 3.2, 3.3, 3.4))

可以看到,标识符的整数值表示Fruit,而小数值表示Variety.

我想要一种方法来创建这些唯一的位置标识符以用于另一个项目(使用 ganttrify,一个优秀但特殊的功能)。 dplyr 友好解决方案的奖励积分。

我们可以使用match基于'Fruit'创建第一个索引和rowid(来自data.table)得到第二个序列索引并将它们粘贴到sprintf

library(dplyr)
library(data.table)
df1 %>%
   mutate(Position2 = sprintf('%d.%d', match(Fruit, unique(Fruit)), rowid(Fruit)))

-输出

# A tibble: 9 × 4
  Fruit  Variety   Position Position2
  <chr>  <chr>        <dbl> <chr>    
1 Apple  Gala           1.1 1.1      
2 Apple  Envy           1.2 1.2      
3 Apple  Pink Lady      1.3 1.3      
4 Pear   Anjou          2.1 2.1      
5 Pear   Bartlett       2.2 2.2      
6 Orange Blood          3.1 3.1      
7 Orange Seville        3.2 3.2      
8 Orange Mandarin       3.3 3.3      
9 Orange Bergamot       3.4 3.4  

看看排名。查看 ties.method 参数。您可能需要使用 ties.method="first".

使用 paste0 + match + ave

的基础 R 选项
> transform(df, position2 = paste0(match(Fruit,unique(Fruit)), ".", ave(Variety, Fruit, FUN = seq_along)))
   Fruit   Variety Position position2
1  Apple      Gala      1.1       1.1
2  Apple      Envy      1.2       1.2
3  Apple Pink Lady      1.3       1.3
4   Pear     Anjou      2.1       2.1
5   Pear  Bartlett      2.2       2.2
6 Orange     Blood      3.1       3.1
7 Orange   Seville      3.2       3.2
8 Orange  Mandarin      3.3       3.3
9 Orange  Bergamot      3.4       3.4

这里是 dplyr 使用 group_indices 的方法。诀窍是用下面的代码克服 group_indices 的字母顺序:

library(dplyr)

df %>% 
  mutate(id = group_indices(., factor(Fruit, levels = unique(Fruit)))) %>% 
  group_by(Fruit) %>% 
  mutate(Position2 = paste(id, row_number(), sep = "."), .keep="unused") %>%
  ungroup()
Fruit  Variety   Position Position2
  <chr>  <chr>        <dbl> <chr>    
1 Apple  Gala           1.1 1.1      
2 Apple  Envy           1.2 1.2      
3 Apple  Pink Lady      1.3 1.3      
4 Pear   Anjou          2.1 2.1      
5 Pear   Bartlett       2.2 2.2      
6 Orange Blood          3.1 3.1      
7 Orange Seville        3.2 3.2      
8 Orange Mandarin       3.3 3.3      
9 Orange Bergamot       3.4 3.4