0

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

我的数据框有一个 personID 和 houseID(以及两者之间的距离),尽管一个人可能匹配多个房子。我想重塑我的数据,以便每人只有一个观察值和 houseID 的多个列。我阅读了有关 melt 和 cast(或 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 函数,但还没有运气。我的 hack 解决方案是首先将所有观察的时间设置为 1,找到 personID 的所有重复项,将这些重复观察的时间设置为 2,找到 personID 和时间的所有重复项,将这些重复项的时间设置为 3,等等. 虽然这不会很好地扩展。

对较小的数据集使用我糟糕的解决方案,我使用 reshape 包进行了 melt() 然后 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>

我也有 distance_1、distance_2、distance_3,但我将其省略,以便更容易查看我的数据。

如果有人可以帮助如何创建时间变量,将不胜感激!

谢谢!

4

2 回答 2

1

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

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

如果“personID”列是factor.

如果你的数据是一个data.table(我们称之为“DT”),你可以使用sequence(.N)如下:

DT[, time := sequence(.N), by = personID]
于 2014-03-21T04:39:43.227 回答
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())
于 2014-03-20T13:00:32.207 回答