2014-02-14 4 views
1

Я пытаюсь выполнить сравнение по каждой строке данных, а затем извлечь строку из другой таблицы на основе результата сравнения. Если индекс, который должен быть просмотрен, больше, чем длина таблицы поиска, тогда необходимо выполнить расчет. Вот что у меня есть. В таблице я итерация является Indicators и выглядит следующим образомR compose datatable using ifelse statment

Row, Val.A, Val.B 
1, 30, 20.0 
2, 3,  40.0 
3, 1,  100.0 
... 

таблице Я отрываясь строки из это Loading и выглядит следующим образом:

Index, Zone.A, Zone.B, Zone.C, Zone.D, Zone.E 
1,  10.0, 20.0, 1.00, 23.0, 34.5 
2,  20.0, 40.0, 10.0, 34.5, 54.0 
3,  40.0, 100.0, 100.0, 67.8, 98.2 
... 
10, 10.0, 10.0, 10.0, 10.0, 10.0 

То, что я пытаюсь сделать, это использовать ifelse() или apply() для этой проблемы, но он не работает. Цель состоит в том, чтобы найти строку в таблице Loading, которая соответствует значению Val.A в таблице Indicators и выполнить расчет, когда в Loading нет данных. Код, который я пытаюсь использовать для этого является следующее:

max.index <- max(Loading[,1]) 
result <- ifelse(Indicators$Val.A < max.index, 
    Loading[[Indicators$Val.A,2:6]], 
    Loading[[max.index,2:6]] * Indicators$Val.A 

)

Используя данные показали результат цель Indicators будет:

Zone.A, Zone.B, Zone.C, Zone.D, Zone.E 
300.0, 300.0, 300.0, 300.0, 300.0 
40.0, 100.0, 100.0, 67.8, 98.2 
10.0, 20.0, 1.00, 23.0, 34.5 

первая строка находится вне доступные строки в таблице Loading, поэтому они вычисляются, но другие строки Indicators имеют значения, содержащиеся в таблице Loading, поэтому эти строки просто выглядят вверх. Спасибо за любую помощь, которую вы можете предоставить. R часто меня путает с его итерационными и векторными операциями.

+0

Is not 'Loading [[max.index, 2: 6]] * Индикаторы $ Val.B = 200', а не 300, как в вашем примере ?? – jlhoward

+0

Извините, опечатка исправлена. –

+0

Отредактировал мой ответ, чтобы быть последовательным. – jlhoward

ответ

1

Это похоже на работу:

z <- merge(Indicators,Loading,by.x="Val.A",by.y="Index",all.x=T) 
z[is.na(z$Zone.A),4:8] <- Loading[nrow(Loading),2:6]*z[is.na(z$Zone.A),]$Val.A 
z 
# Val.A Row Val.B Zone.A Zone.B Zone.C Zone.D Zone.E 
# 1  1 3 100  10  20  1 23.0 34.5 
# 2  3 2 40  40 100 100 67.8 98.2 
# 3 30 1 20 300 300 300 300.0 300.0 

Основная идея заключается в том, чтобы объединить Loadings в Indicators с помощью Indicators$Val.A и Loading$Index, сохраняя все столбцы из Indicators. При отсутствии совпадения, Zone.A - Zone.E в результате будет NA. Итак, теперь мы выбираем только те строки с Zone.A=NA и заполняем ваше второе правило.

Это предполагает, что нагрузки отсортированы по индексу (поэтому последняя строка имеет максимальный (индекс)).

+0

Красивая! Огромное спасибо. Я медленно начинаю понимать способ R делать вещи. Такие примеры действительно помогают. –