在长格式数据框中使用不带列名的熔化将宽格式转换为长格式
Convert wide to long format using melt without column name in long format dataframe
我有一个看起来像这样的数据框
我希望将数据帧转换为这样的长格式
这是我使用的代码
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
))
如果您想要基本的 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")])))
我仍然认为最简洁的方法是 melt with 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
类似地使用 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
我有一个看起来像这样的数据框
我希望将数据帧转换为这样的长格式
这是我使用的代码
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
))
如果您想要基本的 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")])))
我仍然认为最简洁的方法是 melt with 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
类似地使用 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