将行转换为列,然后拆分它们

时间:2017-10-02 08:40:34

标签: r transpose

我有一个数据集,其中包含按行排序的数据:

*VarName1* - *VarValue1*
*VarName2* - *VarValue2*
*Etc.*

我希望它是VarNames成为单独的列。我通过使用以下代码实现了这一点:

DFP1 <- as.data.frame(t(DFP)) #DFP contains the data

现在,这是一个非常大的数据集。它包含多年(数百万行)的数据。上面的代码创建了一个具有&gt;的数据帧。 1E6列。我需要按每个条目拆分这些列。我在第一段数据中看到,每第86列都会出现一个新条目。所以,我试过这个:

tmp <- data.frame(
       X = DFP$noFloat,
       ind = rep(1:86, nrow(DFP)/86)
)

y <- rbind(DFP$nmlVar[1:86], unstack(tmp, X~ind))

这适用于几行。问题是多年来变量的数量增加了,我不能简单地假设每个条目的变量数量是相同的。这导致变量值与其名称不匹配。我正在寻找一种方法来根据变量名称匹配变量和值。

我是高级数据分析的新手,所以如果您还需要更多信息,请与我们联系。

编辑:我创建了一些DFP广告管理系统外观的示例数据,希望能让您更好地理解我的问题:

DFP <- data.frame(
    nmlVar = c("Batch", "Mass", "Length", "Product","Batch", "Mass", 
    "Length", "Product", "Batch", "Mass", "Length", "Width", "Product"),

    noFloat = c(254578, 20, 24, 24547, 254579, 23, 24, 24547, 254580, 20, 
    24, 19, 24547)
)

这里需要注意的重点是第三次重复出现新变量宽度。这对我的数据集来说是典型的,引入了新的变量。这里的关键指标是批处理,每次出现变量批处理时都应拆分。

样本数据的输出:

structure(list(nmlVar = structure(c(1L, 3L, 2L, 4L, 1L, 3L, 2L, 
4L, 1L, 3L, 2L, 5L, 4L), .Label = c("Batch", "Length", "Mass", 
"Product", "Width"), class = "factor"), noFloat = c(254578, 20, 
24, 24547, 254579, 23, 24, 24547, 254580, 20, 24, 19, 24547)), .Names = c("nmlVar", 
"noFloat"), row.names = c(NA, -13L), class = "data.frame")

1 个答案:

答案 0 :(得分:2)

这就是你追求的目标吗?:

library(dplyr)
library(tidyr)
DFP %>% 
  mutate(sample = cumsum(nmlVar == 'Batch')) %>% 
  spread(nmlVar, noFloat)

给出:

  sample  Batch Length Mass Product Width
1      1 254578     24   20   24547    NA
2      2 254579     24   23   24547    NA
3      3 254580     24   20   24547    19