2012-04-22 45 views
-2

我不知道该怎么标题。新的重叠变量

我的人,多年的数据集,以及活动

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年,同时保留与ID

如果我这样做2个步骤协会: 对于id为“1”的原始今年是1971年,所以+/- 3年ID 1将导致:

id all_years 
1 1968 
1 1969 
1 1970 
1 1971 
1 1972 
1 1973 
1 1974 

在第2步中,我想将这个all_years列与原始df中的活动列相结合,保留id。所以id“1”有3个活动(a,b,c)和7年(1968:1964),所以id“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 
... 

与往常一样,谢谢!

+0

请说明你想要使用什么。你的例子有'rep(“1971”),6)'那么这六个实例去哪里?你的输出只需要“df $ id”的每个元素,并在它旁边贴上'seq(df $ years-3,df $ years + 3)'。您是否需要该序列的六个实例,其后每隔一个输入年份的值就有相似的输出块?另外,如何将“年”作为数字而不是字符串?它会让事情变得更容易。哦,“活动”价值观发生了什么变化?他们跟踪“ID”还是“年份”? – 2012-04-22 21:48:34

+0

我投了赞成票似乎是一个难以理解的问题。 – 2012-04-22 23:09:34

+0

对不起的问题措辞和糟糕的代码。希望这可以让问题更容易理解。 – crock1255 2012-04-23 00:27:40

回答

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)),] 

顺便说一句,我建议,有一个列作为“人物”和“年”的混合可能是一个坏主意 - 但你可能有一个很好的理由。

+0

谢谢!这绝对是最后一步,但我失去了+/- 3年的一代... – crock1255 2012-04-23 13:45:00

+0

@ crock1255请参阅编辑。 – csgillespie 2012-04-23 14:37:58