-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

年と活動の列を結合したいのですが、元の年の列では、id との関連付けを維持しながら、年ごとに +/- 3 年を生成したいと考えています。

これを 2 つの手順で行った場合: 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 の activities 列と結合し、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 に答える