Как я могу сделать фрейм данных уникальных значений в существующем столбце? - PullRequest
1 голос
/ 07 февраля 2020

Мне нужно создать новый фрейм данных (col.3), используя только вхождения в предыдущем столбце (col.1), которые соответствуют уникальным значениям в другом столбце (col.2) в существующем фрейме данных.

Мне нужно это:

df1
col.1   col.2     
    1    1             
    1    3             
    1    7             
    1    7            
    2    12                
    2    14   
    2    14
    2    14

 df2
 col.3
     1
     1
     1
     2
     2 

Я пробовал это:

new.col <- cbind(df$col.1[unique(df$col.2)])

Но это дает мне столбец, который слишком длинный, и который не включает полный набор col.1 значений

Я подозреваю, что plyr имеет простое решение этого, но я не понял, что (или любое другое решение) из.

Как я могу достичь желаемого результата? Предпочтительно использовать plyr, но base тоже подойдет.

1 Ответ

1 голос
/ 07 февраля 2020

Мы можем использовать duplicated для создания логического индекса и использовать его для подстановки строк

df2 <- data.frame(col3. = df$col.1[!duplicated(df$col.2)])

Или с subset

subset(df, !duplicated(col.2), select = col.1)

Или с dplyr, используйте distinct на col.2, а затем select 'col.1'

library(dplyr)
df %>%
   distinct(col.2, .keep_all = TRUE) %>%
   select(col.3 = col.1)
#  col.3
#1     1
#2     1
#3     1
#4     2
#5     2

Если дубликаты рассматриваются на основе равенства между смежными элементами, тогда используйте rleid

library(data.table)
df %>% 
    filter(!duplicated(rleid(col.2))) %>% 
    select(col.3 = col.1)

Если мы конвертируем в data.table, unique также имеет опцию by

library(data.table)
unique(setDT(df), by = 'col.2')[, .(col.3 = col.1)]

data

df <- structure(list(col.1 = c(1L, 1L, 1L, 1L, 2L, 2L, 2L), col.2 = c(1L, 
3L, 7L, 7L, 12L, 14L, 14L)), class = "data.frame", row.names = c(NA, 
-7L))
...