Как я могу преобразовать данные одного столбца в упорядоченную последовательность по группам при использовании dplyr? - PullRequest
0 голосов
/ 06 ноября 2019

как я могу решить эту проблему при использовании dplyr?

, сгруппированных по "id", я хочу изменить номер столбца "session", который! = "NA", на порядковый номер 1,2,3, 4 ... данные до преобразования:

    data<-data.frame("id"=c(825010211307012,825010211307012,825010211307012,825010211307012,825010211307012,825010211307021,825010211307021,825010211307021,825010211307021,825010211307021,825010211307021,825010211307021,825010211307021),session=c(1,NA,NA,4,5,1,NA,NA,NA,5,6,NA,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,825010211307012,825010211307012,825010211307012,825010211307012,825010211307021,825010211307021,825010211307021,825010211307021,825010211307021,825010211307021,825010211307021,825010211307021),session=c(1,NA,NA,2,3,1,NA,NA,NA,2,3,NA,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! =«

Кто-нибудь может сказать мне, как я могу добиться этого преобразования?

Я буду очень признателен за вашу помощь!

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Мы можем group_by id, создать инкрементный счетчик для значений не-NA в группе и преобразовать NA в session в NA в temp.

library(dplyr)

data %>%
  group_by(id) %>%
  mutate(temp = cumsum(!is.na(session)), 
         temp = replace(temp, is.na(session), NA))


#                id session temp
#1  825010211307012       1    1
#2  825010211307012      NA   NA
#3  825010211307012      NA   NA
#4  825010211307012       4    2
#5  825010211307012       5    3
#6  825010211307021       1    1
#7  825010211307021      NA   NA
#8  825010211307021      NA   NA
#9  825010211307021      NA   NA
#10 825010211307021       5    2
#11 825010211307021       6    3
#12 825010211307021      NA   NA
#13 825010211307021       8    4
0 голосов
/ 06 ноября 2019
library(tidyverse)

# Your Data
data <- 
  data.frame(
    "id" = c(
      825010211307012,
      825010211307012,
      825010211307012,
      825010211307012,
      825010211307012,
      825010211307021,
      825010211307021,
      825010211307021,
      825010211307021,
      825010211307021,
      825010211307021,
      825010211307021,
      825010211307021
    ),
    session = c(1, NA, NA, 4, 5, 1, NA, NA, NA, 5, 6, NA, 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

Создано в 2019-11-06 пакетом представ (v0.3.0)

Важной частью здесь является порядок, так как НСвсегда считается последним, если вы сортируете свои данные в кадре данных (поэтому row_number будет правильно нумеровать записи в вашей группе). С помощью оператора if_else мы гарантируем, что мы только мутируем соответствующие столбцы

Относительно вашей ошибки: вы не можете просто подмножество строк в функции mutate () (с помощью оператора if_else вы можете мутировать в условии, которое решаетэта проблема)

Надеюсь, что поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...