创建时间变量以融合数据框

时间:2014-03-20 03:37:31

标签: r reshape reshape2 melt

我有一个小小的唠叨问题,希望我能够得到一些帮助......

我的数据框有一个personID和houseID(以及两者之间的距离),但是一个人可能与多个房子匹配。我想重塑我的数据,以便每个人只有一个观察,而houseID只有多个列。我读过有关融化和演员(或dcast)的内容,并且对如何使用它们非常熟悉,但不知道如何创建一个指标来区分与给定选民和第二个选民相关的第一个房子。

这就是我的数据集目前的样子:

personID              schoolID distance
10007347    87-Intl Pre-School      171
10051332      1-Masaryk Towers      153
10066650 74-East Midtown Plaze      193
10066650 75-East Midtown Plaze      106
10066650 76-East Midtown Plaze      195
10078124    87-Intl Pre-School      158

这就是我希望我的数据集在融化之前的样子:

personID              schoolID distance  time
10007347    87-Intl Pre-School      171   1
10051332      1-Masaryk Towers      153   1 
10066650 74-East Midtown Plaze      193   1 
10066650 75-East Midtown Plaze      106   2
10066650 76-East Midtown Plaze      195   3
10078124    87-Intl Pre-School      158   1

换句话说,我想在personID级别排名。我以为可能有一个我失踪的R功能,但还没有运气。我的黑客解决方案是首先将所有观察的时间设置为1,找到所有重复的personID,将这些重复观察的时间设置为2,找到所有重复的personID和时间,将那些重复的时间设置为3,等等虽然这不会很好。

使用我的不良解决方案来处理较小的数据集,我使用reshape包熔化()然后使用cast()看起来像这样:

personID             houseID_1             houseID_2             houseID_3
10007346    87-Intl Pre-School                  <NA>                  <NA>
10051331      1-Masaryk Towers                  <NA>                  <NA>
10066659 74-East Midtown Plaze 75-East Midtown Plaze 76-East Midtown Plaze
10078123    87-Intl Pre-School                  <NA>                  <NA>
10089347    87-Intl Pre-School                  <NA>                  <NA>
10100173    79-Waterside Plaza                  <NA>                  <NA>

我也有距离_1,距离_2,距离_3,但我要离开,所以更容易看到我的数据。

如果有人可以帮助我们如何创建时间变量,那将非常感激!

谢谢!

2 个答案:

答案 0 :(得分:1)

使用dplyr非常简单:

df <- read.csv(text =
"personID,schoolID,distance
10007347,87-Intl Pre-School,171
10051332,1-Masaryk Towers,153
10066650,74-East Midtown Plaze,193
10066650,75-East Midtown Plaze,106
10066650,76-East Midtown Plaze,195
10078124,87-Intl Pre-School,158")

library(dplyr)

df %.% group_by(personID) %.% mutate(time = row_number(personID))

在dplyr 0.2中,您不需要row_number()中的变量:

df %.% group_by(personID) %.% mutate(time = row_number())

答案 1 :(得分:1)

基础R方法的最可能候选者是ave

with(df, ave(personID, personID, FUN = seq_along))
# [1] 1 1 1 2 3 1

如果&#34; personID&#34;你需要修改它。列是factor

如果您的数据是data.table(让我们称之为&#34; DT&#34;),您可以按如下方式使用sequence(.N)

DT[, time := sequence(.N), by = personID]