【问题标题】:tidying data and reshaping key-value to wide format整理数据并将键值重塑为宽格式
【发布时间】:2016-06-18 01:34:43
【问题描述】:

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

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

                                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)

【问题讨论】:

  • 你应该发帖dput(head(dfrm))。目前,该数据的打印表示非常模糊。对于这种操作,您会发现使用字符数据比使用因子数据更容易。这些是键值数据,您正在尝试以“宽”格式构建数据集。看起来好像您“过度解析”了数据。您如何保持八字形与数字的原始关联。列名不应该以十进制字符开头,因此除非您接受前导“X”作为列名,否则您将来可能会做更多不必要的工作。
  • 在 key-value 和 Wide 上搜索会得到这组可能有用的答案:stackoverflow.com/questions/29952780/…
  • @42- 非常感谢您的快速评论。我在上面附上了两个文件。我会检查你发布的链接。

标签: r dataframe reshape tidyr


【解决方案1】:

这看起来像是使用tidyr 包的一个很好的例子。使用gather 转换为两列数据框,以V1 列为键,其他列为值列,命名为dataextract,将data 列拆分为class 和@987654329 @ 列,然后 spread 使用 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 需要 dplyr 包。

【讨论】:

  • 谢谢沃尔特。我做了一些搜索,终于找到了这个漂亮的包裹。我现在正在学习它。
  • 嗨,沃尔特。我使用了您的代码,但遇到了错误Error: Duplicate identifiers for rows (5832, 5898, 5964,...)。我发现这个link 回答了这个问题,我解决了它。但我不明白他对这个错误是如何发生的解释。你能解释一下吗?
  • 基本问题是spread 需要有一组列,它们加在一起唯一标识结果中的每一行。在您链接到的示例中,问题在于feature.measures 的每个值都有多个Species 值。在您的情况下,错误消息可能意味着您在 V1 列中有重复的值。在链接问题中,hadley(许多 RStudio 包的作者 Hadley Wickam)建议在输入数据中添加行号。我已经编辑了我的代码以包含它。如果不需要,row 列可以从结果中删除。
【解决方案2】:

读入数据

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"]}

【讨论】:

  • 谢谢,杰克。我花了一些时间试图理解你的代码。它非常聪明。但我不得不说我现在更喜欢使用 tidyr,因为它似乎对键值对数据有更多的权力,而且更简单。无论如何,谢谢你提出来。
猜你喜欢
  • 2017-07-20
  • 1970-01-01
  • 2021-09-15
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 2017-07-19
相关资源
最近更新 更多