Edit: @ Комментарий Двина к Q был немного загадочным, и, поскольку моя первая попытка в части 1 Q была неправильной из-за неясного Q, я постараюсь выкупить себяс расширением комментария DWin:
[Предполагая, что dat
содержит данные, которые вы цитируете в Q.] Сначала объедините dat
с собой:
> foo <- merge(dat[, -4], dat, by.x = "Date", by.y = "Date")
> head(foo)
Date Name.x Price.x Name.y Price.y Interest
1 01.02.10 X 120 X 120 0.2
2 01.02.10 X 120 R 120 0.2
3 01.02.10 X 120 X 130 0.2
4 01.02.10 X 120 X 140 0.2
5 01.02.10 X 120 R 130 0.2
6 01.02.10 R 120 X 120 0.2
Далее,выведите строки, где Price.x == Price.y
и , где Name.x != Name.y
> (foo <- foo[with(foo, which(Price.x == Price.y & Name.x != Name.y)),])
Date Name.x Price.x Name.y Price.y Interest
2 01.02.10 X 120 R 120 0.2
6 01.02.10 R 120 X 120 0.2
15 01.02.10 X 130 R 130 0.2
23 01.02.10 R 130 X 130 0.2
Затем избавьтесь от лишних столбцов:
> (foo <- foo[, -(4:5)])
Date Name.x Price.x Interest
2 01.02.10 X 120 0.2
6 01.02.10 R 120 0.2
15 01.02.10 X 130 0.2
23 01.02.10 R 130 0.2
И, наконец, исправьтеИмена столбцов:
> names(foo) <- names(dat)
> foo
Date Name Price Interest
2 01.02.10 X 120 0.2
6 01.02.10 R 120 0.2
15 01.02.10 X 130 0.2
23 01.02.10 R 130 0.2
Второе можно сделать с помощью ifelse
with(dat, ifelse(Name == "X", Price + 100*Interest, Price))
, что дает что-то такое
> with(dat, ifelse(Name == "X", Price + 100*Interest, Price))
[1] 140 120 150 160 130
Причина, по которой if()
не работает, заключается в том, что if()
принимает только скалярное логическое (один TRUE
или FALSE
), но Name == "X"
возвращает логический вектор:
> with(dat, Name == "X")
[1] TRUE FALSE TRUE TRUE FALSE
В этих случаях ifelse()
- ваш друг.