当我想到一个更好的标题时,我将很快编辑这个帖子的名称,但就目前而言,下面的一个简短的例子突出了我正在努力解决的问题:
dput(mydf)
structure(list(gameID = c("34", "34", "34", "34", "34", "25",
"25", "25")), class = "data.frame", row.names = c(NA, -8L))
mydf
gameID
1 34
2 34
3 34
4 34
5 34
6 25
7 25
8 25(只包含garbocCol,这样数据就有了>1列--否则请忽略。)这感觉应该是一个相当简单的数据操作问题。我想创建一个新的列,它就是粘贴了该gameID计数的gameID列。因此,我寻求下列产出:
mydf
gameID newCol
1 34 34-1
2 34 34-2
3 34 34-3
4 34 34-4
5 34 34-5
6 25 25-1
7 25 25-2
8 25 25-3gameID列已经是一个字符,newCol最好也是类型字符。我在一个长时间的dplyr链中工作,并试图让以下内容发挥作用:
mydf <- mydf %>%
dplyr::mutate(newCol = paste0(gameID, '-', {what goes here}))我可以很容易地使用for循环来完成这个任务,但是dplyr解决方案会好得多。
发布于 2018-12-07 22:24:47
如果我们需要使用序列进行paste,则使用按'gameID‘和paste分组的row_number()来创建'newCol’。
mydf %>%
group_by(gameID) %>%
mutate(newCol = paste(gameID, row_number(), sep = '-'))
# A tibble: 8 x 3
# Groups: gameID [2]
# gameID garboCol newCol
# <fct> <dbl> <chr>
#1 34 1 34-1
#2 34 2 34-2
#3 34 3 34-3
#4 34 4 34-4
#5 34 5 34-5
#6 25 6 25-1
#7 25 7 25-2
#8 25 8 25-3 如果我们想缩短时间,一个选项是rowid from data.table。优点是它不会在输出中创建组属性
library(data.table)
mydf %>%
mutate(newCol = paste(gameID, rowid(gameID), sep='-'))
# gameID garboCol newCol
#1 34 1 34-1
#2 34 2 34-2
#3 34 3 34-3
#4 34 4 34-4
#5 34 5 34-5
#6 25 6 25-1
#7 25 7 25-2
#8 25 8 25-3或者与glue一起使用它(来自glue)
library(glue)
mydf %>%
mutate(newCol = glue("{gameID}-{rowid(gameID)}"))发布于 2018-12-07 22:27:34
这可能就是你想要的。
mydf %>%
group_by(gameID) %>%
dplyr::mutate(newCol = paste0(gameID, '-', seq_along(gameID)))
# A tibble: 8 x 3
# Groups: gameID [2]
# gameID garboCol newCol
# <fct> <dbl> <chr>
#1 34 1 34-1
#2 34 2 34-2
#3 34 3 34-3
#4 34 4 34-4
#5 34 5 34-5
#6 25 6 25-1
#7 25 7 25-2
#8 25 8 25-3 https://stackoverflow.com/questions/53677504
复制相似问题