整理数据并将键值重塑为宽格式

时间:2016-06-18 01:34:44

标签: r dataframe reshape tidyr

说实话,这对我来说不是一个容易的问题。我搜索了很长时间,但似乎没有类似的问题。

以下是我的数据的几行和几列的样子:

                                V1        V2       V3
1 74c1c25f4b283fa74a5514307b0d0278 1#11:2241 1#10:249
2 08f5b445ec6b29deba62e6fd8b0325a6  20#7:249  20#5:83
3 4b7f6f4e2bf237b6cc58f57142bea5c0  4#16:249   24:913

因此,单元格的格式类似于" class(#subclass):value"。我想制作一张这样的桌子:

                                V1      1#10     1#11    4#16    20#5    20#7    24
1 74c1c25f4b283fa74a5514307b0d0278       249     2241       0       0       0     0      
2 08f5b445ec6b29deba62e6fd8b0325a6         0        0       0      83     249     0
3 4b7f6f4e2bf237b6cc58f57142bea5c0         0        0     249       0       0   913

因为之前我还没有遇到过这种数据结构,所以我不确定这是否是存储它的最佳方式。但到目前为止,这是我能想出的唯一表格格式。如果您对此有任何建议,请发表评论。

然后,我首先解析它如下:

                            V1     V2_1_1 V2_1_2 V2_2_1 V3_1_1 V3_1_2 V3_2_1
1 74c1c25f4b283fa74a5514307b0d0278      1     11   2241      1     10    249
2 08f5b445ec6b29deba62e6fd8b0325a6     20      7    249     20      5     83
3 4b7f6f4e2bf237b6cc58f57142bea5c0      4     16    249     24     NA    913

现在,我不知道如何将其转换为我想要的表格格式。 R中的任何包可以用来做吗?

下面附有两个链接

原始数据:https://www.dropbox.com/s/aqay5dn4r3m3kdp/temp1TrainPoiFile.R?dl=0

解析数据: https://www.dropbox.com/s/0oj8ic1pd2rew0h/temp3TrainPoiFile.R?dl=0

非常感谢你的帮助。如果有任何疑问,请发表评论。

感谢沃尔特和杰克的回答。我使用tidyr来解决问题。以下是我的表现。

读取文件

source("temp1TrainPoiFile.R")

将列集合到键值对

temp2TrainPoiFile <-  temp1TrainPoiFile %>% gather( key=V1, value=data, -V1)

提取到两列

temp3TrainPoiFile <- temp2TrainPoiFile %>% extract(col=data, into=c("class","value"), regex="(.*):(.*)")

添加行号

row <- 1:nrow(temp3TrainPoiFile)
temp3TrainPoiFile <- cbind(row, temp3TrainPoiFile)

将键值传播到两列

TrainPoiFile <- temp3TrainPoiFile %>% spread(key=class, value=value, fill=0)

2 个答案:

答案 0 :(得分:1)

这看起来是使用tidyr包的一个很好的例子。使用gather转换为两列数据框,使用列V1作为键,将其他列转换为名为data的值列,extract以分割{{1}将列添加到dataclass列,然后valuespread列用作新列名,将class列用作值。代码看起来像:

value

编辑以确保行标识符的唯一性。 library(tidyr) library(dplyr) class_table <- df %>% mutate(row = 1:nrow(.)) %>% gather( key=V1, value=data, -c(V1,row)) %>% extract(col=data, into=c("class","value"), regex="(.*):(.*)") %>% spread(key=class, value=value, fill=0) 需要mutate个包。

答案 1 :(得分:0)

读入数据

data <- source("temp1TrainPoiFile.R")[[1]]

适当的NAs

data[data == ""] <- NA

将其重塑为长格式

data <- do.call(rbind, lapply(split(data, data[,"V1"]), function(n) {
                                  id <- n[,1]
                                  n <- na.omit(unlist(n[,-1]))
                                  n <- strsplit(n, ":")
                                  n <- do.call(rbind, lapply(n, function(m) data.frame(column = m[1], value = m[2])))
                                  n <- data.frame(id = id, n)
                                  n}))

准备循环以将值插入新创建的矩阵

id <- unique(data[,"id"])
column <- unique(data[,"column"])
mat <- matrix(data = NA, nrow = length(id), ncol = length(column))
rownames(mat) <- id
colnames(mat) <- column

插入值

for(i in 1:nrow(data)) {
    mat[data[i, "id"], data[i, "column"]] <- data[i,"value"]}