【问题标题】:Creating an ID to reshape a dataset [duplicate]创建一个 ID 来重塑数据集 [重复]
【发布时间】:2017-03-01 23:26:11
【问题描述】:

第一次发帖,主要是因为我厌倦了用头撞墙。

提前感谢您查看此内容。

我有一个如下所示的数据框:

 state city x y z
1 OR Portland 8 10 1
2 OR Portland 8 10 4
3 OR Portland 8 10 10
4 NY New York 29 15 10
5 NY New York 29 15 18
6 NJ Trenton 8 10 50
7 NJ Trenton 8 10 60
8 NJ Trenton 8 10 70
9 WA Seattle 1 70 6
10 WA Seattle 1 70 7
11 WA Seattle 1 70 8
12 WA Seattle 1 70 9
13 WA Seattle 1 70 10
14 WA Seattle 1 70 11

我一直在尝试将其重塑为如下所示:

state city  x  y z.1 z.2 z.3 z.4 z.5 z.6
OR Portland 8  10 1   4   10
NY New York 29 15 10  18
NJ Trenton  8  10 50  60  70
WA Seattle  1  70 6   7   8   9   10  11

我一直在使用reshape2这个包,代码如下:

df <- melt(data,id.vars = c("state","city","x","y"),measure.vars = "z")
wide <- dcast(df, state + city + x + y ~ variable)

它为每组 id.vars 返回变量 z 的计数。

我也试过这个:

wide <- dcast(df, state + city + x + y ~ value)

看起来像这样:

state city  x  y  1 4 6 7 etc...
OR Portland 8  10 1 1 0 0
NY New York 29 15 0 0 0 0
NJ Trenton  8  10 0 0 0 0
WA Seattle  1  70 0 0 1 1

这更接近我要查找的内容,但很难用于查找信息。

如果我错了,请告诉我,但看起来我需要为 state、city、x、y 的每个重复值设置一个 id 变量。

我无法想出或找到任何可以让我创建将重复值编号的列的方法,如下所示。

 state city   x  y  z  num
1 OR Portland 8  10 1  1 
2 OR Portland 8  10 4  2
3 OR Portland 8  10 10 3
4 NY New York 29 15 10 1
5 NY New York 29 15 18 2
6 NJ Trenton  8  10 50 1
7 NJ Trenton  8  10 60 2
8 NJ Trenton  8  10 70 3
9 WA Seattle  1  70 6  1
10 WA Seattle 1  70 7  2
11 WA Seattle 1  70 8  3
12 WA Seattle 1  70 9  4
13 WA Seattle 1  70 10 5
14 WA Seattle 1  70 11 6

我将不胜感激任何帮助或关于在哪里继续寻找解决方案的想法。

最好的,

-n

【问题讨论】:

  • 嗯,我错过了什么 - 我不认为这是一个重复。链接的问题寻找创建顺序 i.ds,而这个问题要求按州和城市列出现有 id 的列表。使用library(data.table),我们可以在这里使用dt[, .(z=list(z)), by= .(state, city, x, y)]
  • @dww - 本质上是同一个问题 - 例如dat$time &lt;- ave(rownames(dat), dat[c("state","city","x","y")], FUN=seq_along); reshape(dat, idvar=c("state","city","x","y"), direction="wide") 只需要创建一个顺序 ID。
  • 感谢您的帮助!我应该可以把它拼凑起来。

标签: r


【解决方案1】:

如果使用dplyr 是您可以使用的选项:

library(dplyr)
df %>% 
    group_by(state,city, x, y) %>% 
    mutate(n = row_number()) %>% 
    spread(n, z, sep = '')

请注意,排序会丢失

【讨论】:

    猜你喜欢
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多