【问题标题】:Convert wide to long format using melt without column name in long format dataframe在长格式数据框中使用没有列名的熔体将宽格式转换为长格式
【发布时间】:2019-05-31 10:09:05
【问题描述】:

我有一个看起来像这样的数据框

我希望将数据框转换为像这样的长格式

这是我使用的代码

long_ex <- melt(wide_ex, id.vars = 5, na.rm=TRUE) #wide_ex is wide format dataframe

但是,我的最终结果是这样的

有没有办法在不提取列名的情况下使用 melt?如果 melt 不适合这项工作,我很乐意接受替代功能

编辑: dput的数据输出

structure(list(ï..Column1 = c(NA, NA, NA, NA), Column2 = c(NA, 
NA, NA, NA), Column3 = c(NA, NA, NA, NA), Column4 = c(NA, NA, 
NA, NA), Column5 = structure(c(2L, 1L, 4L, 3L), .Label = c("Eric ", 
"Jim", "Matt", "Tim"), class = "factor"), Column6 = c(NA, NA, 
NA, NA), Column7 = structure(c(1L, 3L, 2L, 3L), .Label = c("Eric", 
"Erica", "Mary "), class = "factor"), Column8 = structure(c(3L, 
2L, 1L, 3L), .Label = c("Beth", "Loranda", "Matt"), class = "factor"), 
    Column9 = structure(c(2L, 3L, 1L, 3L), .Label = c("Courtney ", 
    "Heather ", "Patrick"), class = "factor"), Column10 = structure(4:1, .Label = c("Beth", 
    "Heather", "John", "Loranda "), class = "factor"), Column11 = c(NA, 
    NA, NA, NA), Column12 = c(NA, NA, NA, NA), Column13 = c(NA, 
    NA, NA, NA), Column14 = c(NA, NA, NA, NA), Column15 = c(NA, 
    NA, NA, NA)), class = "data.frame", row.names = c(NA, -4L
))

【问题讨论】:

  • 为什么以后不能删除'column column'?无论如何,您可以使用dput 分享您的数据吗?
  • @markus 我知道这是一个非常简单的解决方案,但我很好奇我自己的启发的替代方法

标签: r tidyr melt


【解决方案1】:

如果你想要一个基本的 R 解决方案:

data.frame(name_1 = rep(as.character(wide_ex$Column5), each=nrow(wide_ex)),
    name_2 = as.vector(t(wide_ex[, c("Column7", "Column8", "Column9", "Column10")])))

我仍然认为最简洁的方法是使用 data.table 融合:

library(data.table)
setDT(wide_ex)
melt(wide_ex, id.vars = c("Column5"), na.rm=TRUE)[,variable := NULL][]

如果关注速度,它还将提供比 reshape2 显着的速度改进。



(补充说明)... 附加[]有什么用?

A) 在data.table 中使用附加的 [] 称为链接。它允许您对前面的 [] 执行更多操作。

正如您最初指出的那样,melt 的输出会产生一个不需要的列 (variable)。 variable := NULL 删除它。这与执行以下操作基本相同(关于您的原始问题):

 long_ex <- melt(wide_ex, id.vars = 5, na.rm=TRUE) 
 long_ex$variable <- NULL

但是,:= 的使用是通过引用来实现的(并且在同一行)。

链接对于保持代码简洁明了非常有用。假设您想按第一列排序输出(正如您在原始问题中所指出的那样)。你可以这样做:

melt(wide_ex, id.vars = c("Column5"), na.rm=TRUE)[, variable := NULL][order(Column5)][]

data.table 确实是一个了不起的包(尤其是在处理大中型数据时)。如果您有兴趣,我建议您阅读和了解更多信息:https://github.com/Rdatatable/data.table/wiki

【讨论】:

  • 效果很好。你能解释一下[,variable := NULL][] 的作用吗?
  • 查看更新的答案。如果有任何不清楚的地方,请告诉我。
【解决方案2】:

类似地使用melt 来实现tidyverse 方法

library(tidyverse)
library(data.table)

df %>%
  melt(id.vars=5) %>%
  filter(complete.cases(.)) %>%
  select(c(1,3))

 Column5     value
1    Jim     Eric
2    Eric    Mary 
3    Tim     Erica
4    Matt    Mary 
5    Jim     Matt
6    Eric    Loranda
7    Tim     Beth
8    Matt    Matt
9    Jim     Heather 
10   Eric    Patrick
11   Tim     Courtney 
12   Matt    Patrick
13   Jim     Loranda 
14   Eric    John
15   Tim     Heather
16   Matt    Beth

【讨论】:

    猜你喜欢
    • 2015-07-18
    • 2021-07-20
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多