使用dplyr时,如何按组将一列数据转换为有序序列?

使用dplyr时如何处理此问题?

按“ id”分组,我想将“ =”“ NA”的“会话”列号更改为顺序编号1,2,3,4 ... 转换前的数据是:

    data<-data.frame("id"=c(825010211307012,825010211307012,825010211307021,825010211307021),session=c(1,NA,4,5,1,6,8))
      id                  session
825010211307012              1
825010211307012              NA
825010211307012              NA
825010211307012              4
825010211307012              5
825010211307021              1
825010211307021              NA
825010211307021              NA
825010211307021              NA
825010211307021              5
825010211307021              6
825010211307021              NA
825010211307021              8

转换后的数据应为:

data2<-data.frame("id"=c(825010211307012,4))
      id                  session
825010211307012              1
825010211307012              NA
825010211307012              NA
825010211307012              2
825010211307012              3
825010211307021              1
825010211307021              NA
825010211307021              NA
825010211307021              NA
825010211307021              2
825010211307021              3
825010211307021              NA
825010211307021              4

这是我的代码:

data2 <- data %>%
  group_by(id) %>%
  mutate(session[which(session  != "NA")] = 1:length(which(session != "NA"))) 

但是这样会出错:

错误:出现意外的'=':

“ group_by(id)%>%

mutate(session [which(session!=“

有人可以告诉我如何实现这种转变吗?

非常感谢您的帮助!

since1129 回答:使用dplyr时,如何按组将一列数据转换为有序序列?

我们可以group_by id,在组中的非NA值上创建增量计数,并将NA中的session转换为{{ 1}}。

NA
,
library(tidyverse)

# Your Data
data <- 
  data.frame(
    "id" = c(
      825010211307012,825010211307012,825010211307021,825010211307021
    ),session = c(1,NA,4,5,1,6,8)
  )

# Code
data1 <- data %>%
  group_by(id) %>%
  arrange(id,session) %>%
  mutate(
    session = if_else(!is.na(session),row_number(),NA_integer_)
  ) %>%
  ungroup()

# Output
data1
#> # A tibble: 13 x 2
#>         id session
#>      <dbl>   <int>
#>  1 8.25e14       1
#>  2 8.25e14       2
#>  3 8.25e14       3
#>  4 8.25e14      NA
#>  5 8.25e14      NA
#>  6 8.25e14       1
#>  7 8.25e14       2
#>  8 8.25e14       3
#>  9 8.25e14       4
#> 10 8.25e14      NA
#> 11 8.25e14      NA
#> 12 8.25e14      NA
#> 13 8.25e14      NA

reprex package(v0.3.0)于2019-11-06创建

这里重要的部分是安排,因为如果您在数据帧中对数据进行排序,则NA始终被认为是最后一个(因此row_number将正确编号组中的条目)。使用if_else语句,我们确保仅对相关列进行突变

关于您的错误: 您不能只将mutate()函数中的行子集化(使用if_else语句,您可以在解决此问题的条件下进行突变)

希望有帮助

本文链接:https://www.f2er.com/3154528.html

大家都在问