2016-06-10 4 views
1

Как я могу использовать суммарную команду для преобразования этой таблицы:агрегат команда в R

name ID 
a  1 
a  2 
a  2 
a  NA 
b  NA 
c  NA 
c  NA 

к этому один:

name ID 
a  1|2  
b  NA 
c  NA 

Спасибо.

ответ

4

В базе:

> aggregate(ID ~ name, data=x, FUN=function(y) paste(unique(y), 
             collapse='|'),na.action=na.pass) 
    name  ID 
1 a 1|2|NA 
2 b  NA 
3 c  NA 

Это отличается от вашей спецификации в обращении с четвертой строки.

3

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

library(tidyr); 
df$name <- as.factor(df$name) 

aggregate(ID ~ name, unique(df[complete.cases(df),]), paste, collapse = "|") %>% 
    complete(name) 

Source: local data frame [3 x 2] 

    name ID 
    (fctr) (chr) 
1  a 1|2 
2  b NA 
3  c NA 

Логик здесь отфильтровывая все неполные строки и дублированные строки, во-первых, вставить идентификатор вместе, а затем использовать функцию complete из tidyr пакета для автоматического заполнения переменного фактора со всеми чтобы убедиться, что информация отсутствует.

3

Мы можем использовать data.table. Преобразуйте 'data.frame' в 'data.table' (setDT(df1)), сгруппированные по 'name', if элементами в 'ID' являются all NA, тогда мы возвращаем NA или elsepaste элементы unique, которые не являются NA в столбец «ID».

library(data.table) 
setDT(df1)[,.(ID= if(all(is.na(ID))) NA_character_ else 
      paste(na.omit(unique(ID)), collapse = "|")), by = name] 
# name ID 
#1: a 1|2 
#2: b NA 
#3: c NA 

То же методика может быть использована в dplyr

library(dplyr) 
df1 %>% 
    group_by(name) %>% 
    summarise(ID = if(all(is.na(ID))) NA_character_ 
        else paste(unique(ID[!is.na(ID)]), collapse="|")) 
# name ID 
# <chr> <chr> 
#1  a 1|2 
#2  b <NA> 
#3  c <NA> 
Смежные вопросы