Поиск в двух столбцах во фрейме данных - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть фрейм данных с тремя столбцами. Первый и второй столбцы содержат названия мест, а третий - значения. Есть 50 уникальных мест. Я хочу найти похожую комбинацию в столбце 1 и столбце 2 и добавить соответствующие значения. Подобные комбинации, например, включают VillageA в столбце 1 и VillageD в столбце 2 и наоборот (VillageD в столбце 1 и VillageA в столбце 2).

Есть ли самый простой способ сделать это в R?

Воспроизводимые примеры:

value<-rnorm(6,0.5)
from<-c("VillageA","VillageB","VillageC","VillageD", "VillageB","VillageD")
to<-c("VillageD","VillageC", "VillageB","VillageA","VillageD","VillageB")
df<-data.frame(from,to,value)
df

   from       to             value
1 VillageA VillageD   1.8903532567673
2 VillageB VillageC 0.868595180019032
3 VillageC VillageB  1.47556560739867
4 VillageD VillageA  1.09236209542305
5 VillageB VillageD  1.17212213945941
6 VillageD VillageB   1.8903532567673

Ожидаемый результат

from       to             value
VillageA VillageD   2.982715352 ## VillageD and VillageA 
VillageB VillageC   2.344160787 ## VillageC and VillageB
VillageB VillageD   3.062475396 ## VillageD and VillageB

Не существует определенной комбинации (A - B или B - A).

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018
library(tidyverse)
value<-rnorm(6,0.5)
from<-c("VillageA","VillageB","VillageC","VillageD", "VillageB","VillageD")
to<-c("VillageD","VillageC", "VillageB","VillageA","VillageD","VillageB")

Я восстановил data.frame:

df<-data.frame(from,to,value,stringsAsFactors = FALSE)

после этого мы можем рассчитать с помощью dplyr:

df %>% mutate(min=pmin(from,to),max=pmax(from,to)) %>% 
  group_by(min,max) %>% 
  summarise(sum_value=sum(value))
0 голосов
/ 08 ноября 2018

Преобразуйте коэффициенты в character, создайте новые столбцы в последовательном порядке, поместив первую деревню в алфавитном порядке в одну и последнюю в алфавитном порядке в другую, а затем суммируйте по группам. Вот решение base, вы также можете использовать data.table или dplyr, см. Сумма по группе R-FAQ для получения подробной информации о других методах.

df$from = as.character(df$from)
df$to = as.character(df$to)

df$a = pmin(df$from, df$to)
df$b = pmax(df$from, df$to)
aggregate(value ~ a + b, data = df, FUN = sum)
#          a        b      value
# 1 VillageB VillageC  0.6702636
# 2 VillageA VillageD  1.6532692
# 3 VillageB VillageD -1.2560672
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...