-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 的关联

如果我分两步执行此操作: 对于 id "1",原始年份是 1971 年,因此 ID 1 的 +/-3 年将导致:

 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
...

一如既往,谢谢!

4

1 回答 1

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

顺便说一句,我建议将列作为“字符”和“年”的混合可能是一个坏主意 - 但您可能有充分的理由。

于 2012-04-23T07:33:43.537 回答