首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据R中另一列的值和频率创建带有dplyr的列

根据R中另一列的值和频率创建带有dplyr的列
EN

Stack Overflow用户
提问于 2018-12-07 22:21:03
回答 2查看 57关注 0票数 1

当我想到一个更好的标题时,我将很快编辑这个帖子的名称,但就目前而言,下面的一个简短的例子突出了我正在努力解决的问题:

代码语言:javascript
复制
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列。因此,我寻求下列产出:

代码语言:javascript
复制
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-3

gameID列已经是一个字符,newCol最好也是类型字符。我在一个长时间的dplyr链中工作,并试图让以下内容发挥作用:

代码语言:javascript
复制
mydf <- mydf %>% 
  dplyr::mutate(newCol = paste0(gameID, '-', {what goes here}))

我可以很容易地使用for循环来完成这个任务,但是dplyr解决方案会好得多。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-07 22:24:47

如果我们需要使用序列进行paste,则使用按'gameID‘和paste分组的row_number()来创建'newCol’。

代码语言:javascript
复制
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。优点是它不会在输出中创建组属性

代码语言:javascript
复制
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)

代码语言:javascript
复制
library(glue)
mydf %>%
     mutate(newCol = glue("{gameID}-{rowid(gameID)}"))
票数 2
EN

Stack Overflow用户

发布于 2018-12-07 22:27:34

这可能就是你想要的。

代码语言:javascript
复制
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 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53677504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档