2015-10-20 2 views
4

У меня есть набор данных с исходными данными и некоторыми связанными переменными. Это выглядит примерно так:Правильное сравнение данных в R

"Origin","Destination","distance","volume" 
    "A01"  "A01"   0.0  10 
    "A02"  "A01"   1.2   9 
    "A03"  "A01"   1.4  15 
    "A01"  "A02"   1.2  16 

Тогда для каждой пары происхождения-назначение, я хочу, чтобы иметь возможность рассчитать дополнительные переменные, основанные на данных в обеих этой строке и в других выбранных строках. Например, сколько других областей происхождения, отправляющихся в этот пункт назначения, имеют объемы трафика больше фокусной пары. В этом примере я получаю следующее для адресата A01.

"Origin","Destination","distance","volume","greater_flow" 
    "A01" "A01"   0.0  10   1 
    "A02" "A01"   1.2   9   2 
    "A03" "A01"   1.4  15   0 

Я пытался разработать что-то с group_by и apply, но не может работать, как а) «исправить» данные, которые я хочу использовать в качестве эталонного (объемом от А01 до А01) и б) ограничивают сравнение только данными с одним и тем же пунктом назначения (A01) и c) повторяют для всех пар источника-получателя.

ответ

1

здесь ответ, используя базовый R (с помощью apply):

d <- data.frame(Origin = c("A01", "A02", "A03", "A01"), Destination = c("A01", "A01", "A01", "A02"), distance = c(0.0, 1.2, 1.4, 1.2), volume = c(10, 9, 15, 16)) 

# extracting entries with destination = A01 
d2 <- d[d[, "Destination"] == "A01", ] 

# calculating number of rows satisfying your condition 
greater_flow <- apply(d2, 1, FUN = function(x) max(sum(x['volume'] < d2[, 'volume']) - 1, 0)) 

# sticking things back together 
data.frame(d2, greater_flow) 

# Origin Destination distance volume greater_flow 
# 1 A01   A01  0.0  10   1 
# 2 A02   A01  1.2  9   2 
# 3 A03   A01  1.4  15   0 

, если вам необходимо сделать расчет для всех возможных направлений вы можете просто перебирать unique(d[, "Destination"]):

lapply(unique(d[, "Destination"]), FUN = function(dest){ 
     d2 <- d[d[, "Destination"] == dest, ] 
     greater_flow <- apply(d2, 1, FUN = function(x) max(sum(x['volume'] < d2[, 'volume']) - 1, 0)) 

    data.frame(d2, greater_flow)  
}) 

вы можете приклеить выход вместе, если необходимо, через do.call(rbind, output).

+0

Спасибо, это было действительно полезно. Моя фактическая проблема сложнее, но я могу понять, как подойти к ней сейчас. –

0
library(plyr) 
Fun <- function(x) { x <- x[order(x$volume),]; x$greater_flow <- (1:nrow(x))-1; x } 
ddply(d, ~ Destination, .fun=Fun) 
Смежные вопросы