Как я могу использовать суммарную команду для преобразования этой таблицы:агрегат команда в 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
Спасибо.
Как я могу использовать суммарную команду для преобразования этой таблицы:агрегат команда в 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
Спасибо.
В базе:
> 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
Это отличается от вашей спецификации в обращении с четвертой строки.
Вы можете попробовать:
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
пакета для автоматического заполнения переменного фактора со всеми чтобы убедиться, что информация отсутствует.
Мы можем использовать data.table
. Преобразуйте 'data.frame' в 'data.table' (setDT(df1)
), сгруппированные по 'name', if
элементами в 'ID' являются all
NA, тогда мы возвращаем NA или else
paste
элементы 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>