Суммирование или агрегирование столбца элементов на основе двух столбцов с одинаковыми векторами в R - PullRequest
0 голосов
/ 03 апреля 2019

Мне нужно объединить строки, содержащие похожие элементы, в два столбца, пожалуйста. Есть ли функция "или", чтобы сделать это, пожалуйста? Я разместил образец набора данных ниже:

A1 <- data.frame(Animal1= c("A", "A","B","B","D") ,Animal2=c("B","D","D","A","B"),Frequency=c(2,3,1,4,5))
> A1
  Animal1 Animal2 Frequency
1       A       B         2
2       A       D         3
3       B       D         1
4       B       A         4
5       D       B         5

Как агрегировать, чтобы получить только одно значение, объединяющее частоты в строках 3 и 5, где Animal1 - это B, а Animal2 - это D в строке 3, а Animal1 - это D, а Animal2 - B в строке 5, что дает частоту 6?

Ответы [ 3 ]

2 голосов
/ 03 апреля 2019

Вот возможное решение. Я, может быть, слишком усложняю это, но это должно дать вам желаемый результат. Первое, что я сделал, это сделал так, чтобы строки не были факторами в кадре данных.

A1 <- data.frame(Animal1= c("A", "A","B","B","D"), Animal2=c("B","D","D","A","B"), 
                 Frequency=c(2,3,1,4,5), stringsAsFactors = FALSE) 

A1 %>% 
  mutate(combined = map2_chr(Animal1, Animal2, ~paste0(sort(c(.x, .y)), collapse = ""))) %>%  
  group_by(combined) %>% 
  summarise(total = sum(Frequency))

выход

# A tibble: 3 x 2
  combined total
  <chr>    <dbl>
1 AB           6
2 AD           3
3 BD           6
1 голос
/ 03 апреля 2019

Я не уверен, что понял ваш вопрос, но вы это ищете?

library(dplyr)
df %>% as_tibble %>% 
  filter((Animal1 == "B" & Animal2 == "D") | (Animal1 == "D" & Animal2 == "B")) %>% 
  summarise(sum_freq = sum(Frequency))
0 голосов
/ 08 апреля 2019

Спасибо, ребята.В дополнение к ответу @ StephenK я добавил еще один шаг, чтобы разбить новый «комбинированный» столбец.

A1 <- data.frame(Animal1= c("A", "A","B","B","D"), Animal2=c("B","D","D","A","B"), 
             Frequency=c(2,3,1,4,5), stringsAsFactors = FALSE) 

A2<- as.data.frame(A1 %>% mutate(combined = map2_chr(Animal1, Animal2, ~paste0(sort(c(.x, .y)), collapse = ""))) %>%  
group_by(combined) %>% summarise(total = sum(Frequency)))

#create new columns for each letter
A2$Animal1 <- substr(A2$combined, start = 1, stop = 1)
A2$Animal2 <- substr(A2$combined, start = 2, stop = 2)
A2
  combined total Animal1 Animal2
1       AB     6       A       B
2       AD     3       A       D
3       BD     6       B       D

##Select only columns needed and reorder
A3 <- A2[,c("Animal1","Animal2", "total")]
A3
  Animal1 Animal2 total
1       A       B     6
2       A       D     3
3       B       D     6
...