как найти номер строки похожих строк - PullRequest
0 голосов
/ 20 февраля 2019

Мои данные огромны, но я хочу знать номер строки похожих строк

df<- structure(list(x = structure(c(5L, 5L, 5L, 5L, 1L, 1L, 3L, 5L, 
5L, 6L, 6L, 2L, 2L, 2L, 2L, 4L, 4L, 4L, 3L), .Label = c("AJ5ter2", 
"al-1Tter2", "AY9ter2", "CY-Yter2", "LK2ter2", "YY49ter2"), class = "factor")), class = "data.frame", row.names = c(NA, 
-19L))

желаемый вывод показан ниже

LK2ter2  1:4, 9:10
AJ5ter2  5:6
AY9ter2  7, 19
YY49ter2 10:11
al-1Tter2 12:15
CY-Yter2 16:18

Ответы [ 4 ]

0 голосов
/ 20 февраля 2019

Другой вариант с использованием data.table

library(data.table)
DT <- as.data.table(df)
DT[, .(index = paste(unique(range(.I)), collapse = ":")), by = .(x, rleid(x))
   ][, .(index = toString(index)), by = x]
#           x    index
#1:   LK2ter2 1:4, 8:9
#2:   AJ5ter2      5:6
#3:   AY9ter2    7, 19
#4:  YY49ter2    10:11
#5: al-1Tter2    12:15
#6:  CY-Yter2    16:18
0 голосов
/ 20 февраля 2019

Вот один способ с dplyr методами.Не уверен, если вы хотите вывод текста или числовой вектор

library(tidyverse)
df <- structure(list(x = structure(c(5L, 5L, 5L, 5L, 1L, 1L, 3L, 5L, 5L, 6L, 6L, 2L, 2L, 2L, 2L, 4L, 4L, 4L, 3L), .Label = c("AJ5ter2", "al-1Tter2", "AY9ter2", "CY-Yter2", "LK2ter2", "YY49ter2"), class = "factor")), class = "data.frame", row.names = c(NA, -19L))
df %>%
  mutate(row_number = row_number()) %>%
  group_by(x) %>%
  summarise(row_nums = str_c(row_number, collapse = ","))
#> # A tibble: 6 x 2
#>   x         row_nums   
#>   <fct>     <chr>      
#> 1 AJ5ter2   5,6        
#> 2 al-1Tter2 12,13,14,15
#> 3 AY9ter2   7,19       
#> 4 CY-Yter2  16,17,18   
#> 5 LK2ter2   1,2,3,4,8,9
#> 6 YY49ter2  10,11

Создано в 2019-02-19 с помощью пакета Представить (v0.2.1)

0 голосов
/ 20 февраля 2019

Используя tidyverse и data.table, вы можете сделать:

df %>%
 rowid_to_column() %>%
 group_by(x, rleid(x)) %>%
 summarise(res = ifelse(min(rowid) != max(rowid), 
                        paste(min(rowid), max(rowid), sep = ":"), paste(rowid))) %>%
 group_by(x) %>%
 summarise(res = paste(res, collapse = ", "))

  x         res     
  <fct>     <chr>   
1 AJ5ter2   5:6     
2 al-1Tter2 12:15   
3 AY9ter2   7, 19   
4 CY-Yter2  16:18   
5 LK2ter2   1:4, 8:9
6 YY49ter2  10:11

Или то же самое с просто tidyverse:

df %>%
 rowid_to_column() %>%
 group_by(x, x_rleid = {x_rleid = rle(as.numeric(x)); rep(seq_along(x_rleid$lengths), x_rleid$lengths)}) %>%
 summarise(res = ifelse(min(rowid) != max(rowid), 
                        paste(min(rowid), max(rowid), sep = ":"), paste(rowid))) %>%
 group_by(x) %>%
 summarise(res = paste(res, collapse = ", "))

Оба кода, во-первых, добавить столбецс идентификатором строки.Во-вторых, они группируются по «х» и идентификатору группы длин серий «х».В-третьих, они оценивают, равен ли минимальный идентификатор строки максимальному идентификатору строки.Если нет, они объединяют значение минимального и максимального идентификатора строки, разделенных :, в противном случае используется только одно значение идентификатора строки.Наконец, они группируются по «х» и объединяют различные элементы по ,.

Или, если вам нужны все значения, а не только диапазоны:

df %>%
 rowid_to_column() %>%
 group_by(x, x_rleid = {x_rleid = rle(as.numeric(x)); rep(seq_along(x_rleid$lengths), x_rleid$lengths)}) %>%
 summarise(res = paste(rowid, collapse = ",")) %>%
 group_by(x) %>%
 summarise(res = paste(res, collapse = ","))

  x         res        
  <fct>     <chr>      
1 AJ5ter2   5,6        
2 al-1Tter2 12,13,14,15
3 AY9ter2   7,19       
4 CY-Yter2  16,17,18   
5 LK2ter2   1,2,3,4,8,9
6 YY49ter2  10,11  
0 голосов
/ 20 февраля 2019

Вы можете попробовать что-то вроде:

z <- sapply(levels(df$x), function(x) which(x == df$x))
data.frame(key = names(z), index = sapply(z, paste, collapse = ", "), row.names = NULL)

        key            index
1   AJ5ter2             5, 6
2 al-1Tter2   12, 13, 14, 15
3   AY9ter2            7, 19
4  CY-Yter2       16, 17, 18
5   LK2ter2 1, 2, 3, 4, 8, 9
6  YY49ter2           10, 11
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...