Найдите первый пример уникальных значений и номер строки возврата - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть этот фрейм данных:

df <- structure(list(Name = c("Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", 
                          "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", 
                          "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub1", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", 
                          "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", 
                          "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2", "Sub2"), 
                 StimulusName = c("Stim1", "Stim1", "Stim1", "Stim1", "Stim1", "Stim1", "Stim1", "Stim1", "Stim1", "Stim1", "Stim1", "Stim1", 
                                  "Stim1", "Stim1", "Stim1", "Stim1", "Stim1", "Stim1", "Stim1", "Stim2", "Stim2", "Stim2", "Stim2", "Stim2", 
                                  "Stim2", "Stim2", "Stim2", "Stim2", "Stim2", "Stim2", "Stim2", "Stim2", "Stim2", "Stim2", "Stim2", "Stim2", 
                                  "Stim2", "Stim2", "Stim2", "Stim1", "Stim1", "Stim1", "Stim1", "Stim1", "Stim1", "Stim1", "Stim1", "Stim1", 
                                  "Stim1", "Stim1", "Stim1", "Stim1", "Stim1", "Stim1", "Stim1", "Stim1", "Stim1", "Stim1", "Stim1", "Stim2", 
                                  "Stim2", "Stim2", "Stim2", "Stim2", "Stim2", "Stim2", "Stim2", "Stim2", "Stim2", "Stim2", "Stim2", "Stim2", 
                                  "Stim2", "Stim2", "Stim2", "Stim2", "Stim2", "Stim2", "Stim2"), 
                 Fixation = c(NA, NA, 1L, 1L, NA, NA, 2L, 2L, 3L, 3L, NA, NA, NA, NA, NA, 4L, 4L, 5L, 5L, NA, NA, NA, NA, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
                              2L, NA, NA, NA, 3L, 3L, 3L, NA, NA, NA, NA, NA, NA, 1L, 1L, 1L, 1L, 2L, 2L, NA, NA, 3L, 3L, 3L, 4L, 4L, 4L, NA, NA, 1L, 1L, NA, 
                              NA, 2L, 2L, 3L, 3L, NA, NA, NA, NA, NA, 4L, 4L, 5L, 5L, NA)), 
            row.names = c(NA, -79L), class = c("tbl_df", "tbl", "data.frame"))

Есть 3 столбца: Name, StimulusName и Fixation.

Я бы хотел иметь возможность вернуть номер строки для первых примеров уникальных значений в столбце Fixation и сгруппировать их по Name и StimulusName.

Вот что я пробовал до сих пор (основываясь на частичном решении, найденном в другом месте):

# function to return rows
Unique_Indices <- function(Values){
  unik <- !duplicated(Values)  ## logical vector of unique values
  return(seq_along(Values)[unik])  ## indices
}

Но когда я использую его с цепочкой dplyr, он не возвращает исходные номера строк, а наоборот начинает отсчет строк заново с помощью группировки:

library(tidyr)

# This doesn't work
Unique_Index <- df %>%
  group_by(Name, StimulusName) %>%
  summarise(Indices = list(Unique_Indices(Fixation))) %>%
  unnest()

Неправильный вывод выглядит так:

enter image description here

Вы можете видеть, что Indices не содержит исходных номеров строк после перехода на следующие StimulusName взносы к инструкции group_by. Есть ли способ, которым я могу group_by, как я желаю, сохранив исходный номер строки из df?

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Вы можете напрямую отфильтровать недублированные значения Fixation для каждой группы и сначала повернуть имена строк в соответствующий столбец, чтобы сохранить индексы.

library(dplyr)
library(tibble)

df %>% 
  rownames_to_column() %>% 
  group_by(Name, StimulusName) %>%
  filter(!duplicated(Fixation))

# A tibble: 21 x 4
# Groups:   Name, StimulusName [4]
#    rowname Name  StimulusName Fixation
#    <chr>   <chr> <chr>           <int>
#  1 1       Sub1  Stim1              NA
#  2 3       Sub1  Stim1               1
#  3 7       Sub1  Stim1               2
#  4 9       Sub1  Stim1               3
#  5 16      Sub1  Stim1               4
#  6 18      Sub1  Stim1               5
#  7 20      Sub1  Stim2              NA
#  8 24      Sub1  Stim2               1
#  9 28      Sub1  Stim2               2
# 10 37      Sub1  Stim2               3
# ... with 11 more rows

С предложением Ронака Шаха dplyr -только решение может выглядеть так:

df %>% 
  mutate(Index = row_number()) %>% 
  group_by(Name, StimulusName) %>%
  filter(!duplicated(Fixation))
0 голосов
/ 06 ноября 2018

Вот вариант с base R

cbind(unique(df)[-3], Fixation = which(!duplicated(df)))
#   Name StimulusName Fixation
#1  Sub1        Stim1        1
#2  Sub1        Stim1        3
#3  Sub1        Stim1        7
#4  Sub1        Stim1        9
#5  Sub1        Stim1       16
#6  Sub1        Stim1       18
#7  Sub1        Stim2       20
#8  Sub1        Stim2       24
#9  Sub1        Stim2       28
#10 Sub1        Stim2       37
#11 Sub2        Stim1       40
#12 Sub2        Stim1       46
#13 Sub2        Stim1       50
#14 Sub2        Stim1       54
#15 Sub2        Stim1       57
#16 Sub2        Stim2       60
#17 Sub2        Stim2       62
#18 Sub2        Stim2       66
#19 Sub2        Stim2       68
#20 Sub2        Stim2       75
#21 Sub2        Stim2       77
0 голосов
/ 06 ноября 2018

В data.table есть переменная .I, которая является номером строки, поэтому вы можете просто ввести подмножество .I. Indices в моем выводе должно совпадать с rowname в выводе из кода в комментарии @ kath.

library(data.table)
setDT(df)

df[, .(Indices = .I[!duplicated(Fixation)])
   , .(Name, StimulusName)]


#     Name StimulusName Indices
#  1: Sub1        Stim1       1
#  2: Sub1        Stim1       3
#  3: Sub1        Stim1       7
#  4: Sub1        Stim1       9
#  5: Sub1        Stim1      16
#  6: Sub1        Stim1      18
#  7: Sub1        Stim2      20
#  8: Sub1        Stim2      24
#  9: Sub1        Stim2      28
# 10: Sub1        Stim2      37
# 11: Sub2        Stim1      40
# 12: Sub2        Stim1      46
# 13: Sub2        Stim1      50
# 14: Sub2        Stim1      54
# 15: Sub2        Stim1      57
# 16: Sub2        Stim2      60
# 17: Sub2        Stim2      62
# 18: Sub2        Stim2      66
# 19: Sub2        Stim2      68
# 20: Sub2        Stim2      75
# 21: Sub2        Stim2      77
#     Name StimulusName Indices
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...