Новая перекрывающаяся переменная
Я не был уверен, что назвать это.
У меня есть набор данных людей, лет и видов деятельности
df <- data.frame("id" = c("1", "1", "1", "2", "2","3"), "years" = rep(1971, 6),
"activity" = c("a","b","c","d","e","e"))
id years activity
1 1 1971 a
2 1 1971 b
3 1 1971 c
4 2 1971 d
5 2 1971 e
6 3 1971 e
Я хочу объединить столбцы лет и видов деятельности, но для каждого года в исходном столбце лет я хочу создать +/- 3 года, сохранив связь с идентификатором.
Если бы я сделал это в 2 этапа: для идентификатора "1" исходный год - 1971, поэтому +/- 3 года для идентификатора 1 приведет к:
id all_years
1 1968
1 1969
1 1970
1 1971
1 1972
1 1973
1 1974
На шаге 2 я хочу объединить этот столбец all_years со столбцом активности из исходного df, сохранив идентификаторы. Таким образом, идентификатор "1" имеет 3 вида деятельности (a,b,c) и 7 лет (1968:1964), поэтому идентификатор "1" будет отображаться 10 раз в новом объединенном столбце.
В конечном итоге, я бы получил что-то вроде этого:
id year_and_activities
1 a
1 b
1 c
1 1968
1 1969
1 1970
1 1971
1 1972
1 1973
1 1974
2 d
2 e
2 1968
...
2 1974
...
3 e
...
Как всегда, спасибо!
1 ответ
Я не мог точно ответить на ваш вопрос, но, учитывая начальный фрейм данных, вы можете получить ваш окончательный фрейм данных, используя melt
:
require(reshape2)
##To get your +/- 3
dd = data.frame(id=df$id, activity=df$activity,
years=df$years- rep(-3:3, nrow(df)))
##Pretty much gives you what you want
df_melt = melt(dd, id=1)
##Remove the unnecessary column
df_melt = df_melt[,c(1,3)]
##Rename
colnames(df_melt) = c("id","year_and_activities")
##Order the column
df_melt[with(df_melt, order(id, year_and_activities)),]
Кроме того, я бы предположил, что колонка, состоящая из "символов" и "лет", вероятно, является плохой идеей, но у вас может быть на то веская причина.