Ответ 1
Есть несколько способов сделать это (это R, в конце концов), но я думаю, что наиболее ясным является создание индекса. Нам нужна функция, которая создает последовательный индекс (начиная с одного и заканчивая количеством наблюдений).
seq_len(3)
> [1] 1 2 3
Но нам нужно вычислить этот индекс в каждой переменной (состоянии) группы. Для этого мы можем использовать функцию R ave
. Он принимает числовое значение как первый аргумент, затем факторы группировки и, наконец, функцию, которая должна применяться в каждой группе.
s1$index <- with(s1,ave(value1,state,FUN=seq_len))
s2$index <- with(s2,ave(value2,state,FUN=seq_len))
(Обратите внимание на использование with
, которое сообщает R для поиска переменных внутри среды /dataframe. Это лучше, чем использование s1 $value1, s2 $value2 и т.д.)
Теперь мы можем просто объединить (объединить) два кадра данных (по переменным, присутствующим в обоих кадрах данных: состоянии и индексе).
merge(s1,s2)
который дает
state index value1 value2
1 IA 1 1 6
2 IA 2 2 7
3 IA 3 3 8
4 IL 1 4 3
5 IL 2 5 4
6 IL 3 6 5
Для этого в каждом из кадров данных должно быть такое же количество наблюдений по состоянию.
[Изменить: прокомментировал код для ясности.] [Edit: Используется seq_len вместо создания новой функции, предложенной hadley.]