Поиск повторяющихся наблюдений за выбранными переменными в таблице - PullRequest
0 голосов
/ 29 ноября 2018

У меня довольно большой тиббл (называемый df.tbl с ~ 26k строками и 22 столбцами), и я хочу найти «двойников» каждого объекта, то есть каждой строки с одинаковыми значениями в столбце 2: 7 (дата: Pos).

Если я использую:

inner_join(df.tbl, ~ df.tbl[i,], by = c("date", "forge", "serNum", "PinMain", "PinMainNumber", "Pos"))

, где i - строка, которую я хочу проверить на «близнецы», все работает, как и ожидалось, выплевывая столбик 2 x 22, иЯ могу расширить это, используя:

x <- NULL
for (i in 1:nrow(df.tbl)) {
x[[i]] <- as_vector(inner_join(df.tbl[,], 
                        df.tbl[i,], 
                        by = c("date", 
                               "forge", 
                               "serNum", 
                               "PinMain", 
                               "PinMainNumber", 
                               "Pos")) %>% 
               select(rowNum.x) 
}

, чтобы создать список, содержащий номера строк для каждого двойника для каждого объекта (строки).

Я не могу, однако пытаюсь использовать mapчтобы получить аналогичный результат:

twins <- map(df.tbl, ~ inner_join(df.tbl, 
                                     ., 
                                     by = c("date", 
                                            "forge", 
                                            "serNum", 
                                            "PinMain", 
                                            "PinMainNumber", 
                                            "Pos")) %>% 
         select(rowNum.x) )

Все, что я получаю, это следующая ошибка:

Error in UseMethod("tbl_vars") : no applicable method for 'tbl_vars' applied to an object of class "c('double', 'numeric')"

Как мне поступитьпреобразовать цикл for в эквивалент, используя map?

Мои исходные данные выглядят так:

>head(df.tbl, 3)
# A tibble: 3 x 22
  rowNum date       forge serNum PinMain PinMainNumber Pos   FrontBack flow  Sharped SV    OP      max   min  mean
   <dbl> <date>     <chr> <fct>  <fct>   <fct>         <fct> <fct>     <chr> <fct>   <fct> <chr> <dbl> <dbl> <dbl>
1      1 2017-10-18 NA    179    Pin     1             W     F         NA    3       36237 235    77.7  55.3  64.7
2      2 2017-10-18 NA    179    Pin     2             W     F         NA    3       36237 235    77.5  52.1  67.4
3      3 2017-10-18 NA    179    Pin     3             W     F         NA    3       36237 235    79.5  58.6  69.0
# ... with 7 more variables: median <dbl>, sd <dbl>, Round2 <dbl>, Round4 <dbl>, OrigData <list>, dataSize <int>,
#   fileName <chr>

, и я хотел бы получить список с длиной, равной nrow (df.tbl) выглядит следующим образом:

> twins
[[1]]
[1] 1 7

[[2]]
[1] 2 8

[[3]]
[1] 3 9

Почти все объекты имеют один близнец / дубликат (как указано выше), но некоторые имеют два или даже три дубликата (как определено выше, т.е. столбец 2: 7 - этото же самое)

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Немного опоздал на вечеринку, но вы можете сделать это намного аккуратно с nest().

tbl.df1 <- tbl.df %>% group_by(date, forge, serNum, PinMain, PinMainNumber, Pos) %>% nest(rowNum)

Близнецы будут в списке тибблов, созданных nest.

tbl.df1$data

# [[1]]
# A tibble: 2 x 1
#   rowNum
#    <dbl>
# 1      1
# 2      7

#[[2]]
# A tibble: 2 x 1
#   rowNum
#    <dbl>
# 1      2
# 2      8

# etc
0 голосов
/ 29 ноября 2018

вам действительно нужно решить это с map?

Я бы решил путем объединения duplicated и semi_join из пакета dplyr, как это

defining_columns <- c("date", "forge", "serNum", "PinMain", "PinMainNumber", "Pos")

dplyr::semi_join(
  df.tbl,
  df.tbl[duplicated(df.tbl[defining_columns]),],
  by = defining_columns
) %>% 
  group_by_at(defining_columns) %>% 
  arrange(.by_group = TRUE) %>%
  summarise(twins = paste0(rowNum,collapse = ",")) %>% 
  pull(twins) %>% 
  strsplit(",")

duplicated дает нам, какие строки дублируются, а semi_join сохраняет только строки в x, которые присутствуют в y

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

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