2015-04-25 2 views
1

У меня есть два кадра данных d1 и d2. d2 имеет столбец, который содержит данные, которые я бы предпочел добавить к d1.Вставка значений столбца из одного кадра данных в другой при соблюдении данного условия

Каждый из кадров данных имеет равное количество строк и столбцов.

> d1 
    t1 t2 numVehicles avgByRunRep 
1 0.2 0.3   10 225.5000 
2 0.2 0.4   10 219.6667 
3 0.2 0.5   10 205.1667 
4 0.2 0.6   10 220.6667 
5 0.2 0.7   10 205.1667 

> d2 
    t1 t2 numVehicles avgLostPerRep 
1 0.2 0.3   10  14.333333 
2 0.2 0.4   10  9.000000 
3 0.2 0.5   10  8.000000 
4 0.2 0.6   10  8.000000 
5 0.2 0.7   10  6.833333 

Поэтому я хотел бы значения в d2 «ы avgLostPerRep столбца быть "передано", чтобы d1 путем сопоставления t1, t2, numVehicles.

Таким образом, в конце концов d1 будет выглядеть примерно так:

> d1 
    t1 t2 numVehicles avgByRunRep avgLostPerRep 
1 0.2 0.3   10 225.5000 14.333333 
2 0.2 0.4   10 219.6667 9.000000 
3 0.2 0.5   10 205.1667 8.000000 
4 0.2 0.6   10 220.6667 8.000000 
5 0.2 0.7   10 205.1667 6.833333 

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

Я хотел бы знать, как это можно решить с помощью sqldf, но чистый R в порядке.

Я пробовал merge от R, но получил большую кадр данных с большим количеством NA. Я также пробовал UPDATE и INSERT INTO за sqldf безрезультатно.

+1

'merge (d1, d2, by = c ('t1', 't2', 'numVehicles'))' дает ожидаемый результат, хотя, или используя библиотеку 'data.table'' (data.table), setkey (setDT (d1), t1, t2, numVehicles) [d2] ' – akrun

+0

Я просто попробовал это:' temp <- merge (d1, d2, all.x = T, sort = F) ', и я получил ожидаемый результат. Не могли бы вы объяснить разницу между этими двумя командами и как они работают? – cross

+2

просто 'merge (d1, d2)' также работает в данных примера, так как общие столбцы в обоих наборах данных используются в 'by ='. Не могли бы вы показать код, который не сработал? – akrun

ответ

1

1) Это выполняет левое соединение вдоль указанных колонок:

library(sqldf) 
sqldf("select * from d1 left join d2 using(t1, t2, numVehicles)") 

Мы могли бы попеременно использовать левый естественное соединение, которое приводит к тому, присоединиться происходить вдоль обычно называемые колонками:

sqldf("select * from d1 left natural join d2") 

Для данных, представленных в вопросе, мы можем поочередно использовать внутреннее соединение, просто опуская слово left в любом из вышеперечисленных; однако, если фактические данные не имеют значения в d2 для каждой строки d1, тогда внутреннее соединение будет опускать эти строки d1, тогда как левое объединение будет включать их и добавить NA для объединенного столбца d2.

2) Соответствующий нативный код R будет это для первого оператора sqldf

merge(d1, d2, all.x = TRUE, by = 1:3) 

и это для второй:

merge(d1, d2, all.x = TRUE) 

Внутренние соединения получаются путем исключения all.x = TRUE в в любом случае.

0

Основание R:

merge(d1, d2)

sqldf:

library(sqldf) 
query = "SELECT a.t1, a.t2, a.numVehicles, a.avgByRunRep, b.avgLostPerRep FROM d1 a INNER JOIN d2 b WHERE a.t2=b.t2" 
sqldf(query) 
1

Вы можете попробовать data.table пакет до тех пор, как ваш вопрос очень прост с его синтаксис и ключи и объединить волю быть намного быстрее, чем база R

Восстанавливающие наборы данных:

library(data.table) 

d1<- fread("t1,t2,numVehicles,avgByRunRep 
0.2,0.3,10,225.5000 
0.2,0.4,10,219.6667 
0.2,0.5,10,205.1667 
0.2,0.6,10,220.6667 
0.2,0.7,10,205.1667") 

# setting desired columns as keys is important in your case 
# and setkey(d1) would be enough to use all columns in d1 
setkey(d1, t1, t2, numVehicles) 

d2<- fread("t1,t2,numVehicles,avgLostPerRep 
0.2,0.3,10,14.333333 
0.2,0.4,10,9.000000 
0.2,0.5,10,8.000000 
0.2,0.6,10,8.000000 
0.2,0.7,10,6.833333") 

Решение:

merge(d1, d2) 
# t1 t2 numVehicles avgByRunRep avgLostPerRep 
#1: 0.2 0.3   10 225.5000  14.333333 
#2: 0.2 0.4   10 219.6667  9.000000 
#3: 0.2 0.5   10 205.1667  8.000000 
#4: 0.2 0.6   10 220.6667  8.000000 
#5: 0.2 0.7   10 205.1667  6.833333