我的tibble中有一列值为10 10 20 20 20 30 30,我想创建一个新列,如下所示:10a 10b 10c 20a 20b 20c 20d 30a 30b。
仅使用dplyr的更简单简洁的解决方案。
# import library
library(dplyr)
# data
df <- data.frame(id = c(10, 10, 10, 20, 20, 20, 20, 30, 30))
# solution
df %>%
group_by(id) %>% # grouping by id
mutate(
alpha_id = letters[1:length(id)], # create alpha id
new_id = paste0(id, alpha_id) # new_id = id + alpha_id
) %>%
ungroup() %>% # ungroup
select(-alpha_id) # dropping staging variable.
输出
# A tibble: 9 x 2
id new_id
<dbl> <chr>
1 10 10a
2 10 10b
3 10 10c
4 20 20a
5 20 20b
6 20 20c
7 20 20d
8 30 30a
9 30 30b
BaseR
df$x2 <- ave(df$x, df$x, FUN = function(.x) paste0(.x, letters[seq_len(length(.x))]))
x x2
1 10 10a
2 10 10b
3 10 10c
4 20 20a
5 20 20b
6 20 20c
7 20 20d
8 30 30a
9 30 30b
dplyr
df <- data.frame(x = c(10, 10, 10, 20, 20, 20, 20, 30, 30))
library(dplyr)
df %>% group_by(x) %>%
mutate(x2 = paste0(x, letters[row_number()]))
# A tibble: 9 x 2
# Groups: x [3]
x x2
<dbl> <chr>
1 10 10a
2 10 10b
3 10 10c
4 20 20a
5 20 20b
6 20 20c
7 20 20d
8 30 30a
9 30 30b
这里有一个使用dplyr
和data.table
:的经济解决方案
首次转换为数据帧:
df <- data.frame(x = c(10, 10, 10, 20, 20, 20, 20, 30, 30))
现在使用data.table
的函数rowid
和rowid
上的内置常数letters
(用于小写字母(在dplyr
中进行转换(归功于@Henrik(:
library(dplyr)
library(data.table)
df %>%
mutate(x_new = paste0(x, letters[rowid(x)]))
# A tibble: 9 x 2
x x_new
<dbl> <chr>
1 10 10a
2 10 10b
3 10 10c
4 20 20a
5 20 20b
6 20 20c
7 20 20d
8 30 30a
9 30 30b