R cast не может иметь дело с уникальными строками

Вопрос


я имею cluster.id и в соответствии с этим cluster.id у меня есть разные letters найден в каждом кластере (как упрощение).

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

Это кажется такой работой (без ошибок), однако приведенная матрица заполняется 'NA' и строки вместо желаемого количества (я объясню все далее в комментариях к коду ниже).

Любые предложения, как решить эту проблему, или это просто что-то, что невозможно после фильтрации уникальных строк?

Код


test.set <- read.table(text = "
                            cluster.id   letters
                       1          4       A
                       2          4       B
                       3          4       B
                       4          3       A
                       5          3       E
                       6          3       D
                       7          3       C
                       8          2       A
                       9          2       E
                       10          1       A", header = T, stringsAsFactors = F)



# remove irrelevant clusters (clusters which only contain 1 letter)
test.set <- test.set %>% group_by( cluster.id ) %>%
  mutate(n.letters = n_distinct(letters)) %>%
  filter(n.letters > 1) %>%
  ungroup() %>%
  select( -n.letters)

test.set
#  cluster.id letters
#<int>   <chr>
#1          4       A
#2          4       B
#3          4       B
#4          3       A
#5          3       E
#6          3       D
#7          3       C
#8          2       A
#9          2       E



# I dont want duplicated rows becasue they are misleading.
# I'm only interested in which letters are found togheter in a 
# cluster not in what proportions
# Therefore I want to remove these duplicated rows

test.set.unique <- test.set %>% unique()
matrix <- acast(test.set.unique, cluster.id ~ letters)

matrix
#  A   B   C   D   E  
#2 "A" NA  NA  NA  "E"
#3 "A" NA  "C" "D" "E"
#4 "A" "B" NA  NA  NA 


# This matrix contains NA values and letters intead of the counts I wanted.
# However using the matrix before filtering for unique rows works fine

matrix <- acast(test.set, cluster.id ~ letters)
matrix
#  A B C D E
#2 1 0 0 0 1
#3 1 0 1 1 1
#4 1 2 0 0 0

1 ответ

Решение

Если мы также посмотрим на сообщения, было бы сообщение над выводом

Отсутствует функция агрегирования: по умолчанию длина

Чтобы получить аналогичный вывод, укажите fun.aggregate

acast(test.set.unique, cluster.id ~ letters, length)
#  A B C D E
#2 1 0 0 0 1
#3 1 0 1 1 1
#4 1 1 0 0 0

При наличии дублирующих элементов по умолчанию fun.aggregate срабатывает для length, С unique элементы, без указания fun.aggregate, это примет value.var столбец и заполните значения этого столбца, чтобы получить вывод, как в посте ОП

Другие вопросы по тегам