如何将数字标识符列表添加到 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
您好,欢迎来到我的问题。
我想创建一个基于位置的唯一数字标识符列表,以表示项目在数据框中一列值中的位置。
这是我想要的示例(在 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
> 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