如何将具有不同列名的数据框从宽转换为长,具有不同的列名
How to transform data frame with different column names from wide to long, with different column names
我有一个宽格式的数据框,我想将其转换为长格式(融合)以便处理它。问题是 "P" 列有不同的名称,新数据框需要一个新的 "Channel" 列,这样 header 中的信息就不会丢失。请参阅下图以获取图片。
这是数据框:
df <- read.table(text=
"ID T P.1 P.2 P.3
1 24.3 10.2 5.5 2.1
2 23.4 10.4 5.7 2.8
3 22.1 10.5 5.9 3.1
4 19.9 10.2 5.2 2.4
", header=T)
reshape(df,direction="long", varying=list(names(df)[3:5]), v.names="Value",idvar=c("ID","T"))
ID T time Value
1.24.3.1 1 24.3 1 10.2
2.23.4.1 2 23.4 1 10.4
3.22.1.1 3 22.1 1 10.5
4.19.9.1 4 19.9 1 10.2
1.24.3.2 1 24.3 2 5.5
2.23.4.2 2 23.4 2 5.7
3.22.1.2 3 22.1 2 5.9
4.19.9.2 4 19.9 2 5.2
1.24.3.3 1 24.3 3 2.1
2.23.4.3 2 23.4 3 2.8
3.22.1.3 3 22.1 3 3.1
4.19.9.3 4 19.9 3 2.4
这是一个相当简单的 "wide" 到 "long" 问题。以下是三种方法:
与"reshape2"
library(reshape2)
melt(df, id.vars = c("ID", "T"), variable.name = "Channel", value.name = "P")
# ID T Channel P
# 1 1 24.3 P.1 10.2
# 2 2 23.4 P.1 10.4
# 3 3 22.1 P.1 10.5
# 4 4 19.9 P.1 10.2
# 5 1 24.3 P.2 5.5
# 6 2 23.4 P.2 5.7
# 7 3 22.1 P.2 5.9
# 8 4 19.9 P.2 5.2
# 9 1 24.3 P.3 2.1
# 10 2 23.4 P.3 2.8
# 11 3 22.1 P.3 3.1
# 12 4 19.9 P.3 2.4
以 R 为基数 reshape
reshape(df, direction = "long",
idvar = c("ID", "T"),
timevar = "Channel",
varying = 3:ncol(df))
# ID T Channel P
# 1.24.3.1 1 24.3 1 10.2
# 2.23.4.1 2 23.4 1 10.4
# 3.22.1.1 3 22.1 1 10.5
# 4.19.9.1 4 19.9 1 10.2
# 1.24.3.2 1 24.3 2 5.5
# 2.23.4.2 2 23.4 2 5.7
# 3.22.1.2 3 22.1 2 5.9
# 4.19.9.2 4 19.9 2 5.2
# 1.24.3.3 1 24.3 3 2.1
# 2.23.4.3 2 23.4 3 2.8
# 3.22.1.3 3 22.1 3 3.1
# 4.19.9.3 4 19.9 3 2.4
与"tidyr" + "dplyr"
library(dplyr)
library(tidyr)
df %>%
gather(Channel, P, P.1:P.3) %>%
mutate(Channel = gsub("P.", "", Channel))
# ID T Channel P
# 1 1 24.3 1 10.2
# 2 2 23.4 1 10.4
# 3 3 22.1 1 10.5
# 4 4 19.9 1 10.2
# 5 1 24.3 2 5.5
# 6 2 23.4 2 5.7
# 7 3 22.1 2 5.9
# 8 4 19.9 2 5.2
# 9 1 24.3 3 2.1
# 10 2 23.4 3 2.8
# 11 3 22.1 3 3.1
# 12 4 19.9 3 2.4
我有一个宽格式的数据框,我想将其转换为长格式(融合)以便处理它。问题是 "P" 列有不同的名称,新数据框需要一个新的 "Channel" 列,这样 header 中的信息就不会丢失。请参阅下图以获取图片。
这是数据框:
df <- read.table(text=
"ID T P.1 P.2 P.3
1 24.3 10.2 5.5 2.1
2 23.4 10.4 5.7 2.8
3 22.1 10.5 5.9 3.1
4 19.9 10.2 5.2 2.4
", header=T)
reshape(df,direction="long", varying=list(names(df)[3:5]), v.names="Value",idvar=c("ID","T"))
ID T time Value
1.24.3.1 1 24.3 1 10.2
2.23.4.1 2 23.4 1 10.4
3.22.1.1 3 22.1 1 10.5
4.19.9.1 4 19.9 1 10.2
1.24.3.2 1 24.3 2 5.5
2.23.4.2 2 23.4 2 5.7
3.22.1.2 3 22.1 2 5.9
4.19.9.2 4 19.9 2 5.2
1.24.3.3 1 24.3 3 2.1
2.23.4.3 2 23.4 3 2.8
3.22.1.3 3 22.1 3 3.1
4.19.9.3 4 19.9 3 2.4
这是一个相当简单的 "wide" 到 "long" 问题。以下是三种方法:
与"reshape2"
library(reshape2)
melt(df, id.vars = c("ID", "T"), variable.name = "Channel", value.name = "P")
# ID T Channel P
# 1 1 24.3 P.1 10.2
# 2 2 23.4 P.1 10.4
# 3 3 22.1 P.1 10.5
# 4 4 19.9 P.1 10.2
# 5 1 24.3 P.2 5.5
# 6 2 23.4 P.2 5.7
# 7 3 22.1 P.2 5.9
# 8 4 19.9 P.2 5.2
# 9 1 24.3 P.3 2.1
# 10 2 23.4 P.3 2.8
# 11 3 22.1 P.3 3.1
# 12 4 19.9 P.3 2.4
以 R 为基数 reshape
reshape(df, direction = "long",
idvar = c("ID", "T"),
timevar = "Channel",
varying = 3:ncol(df))
# ID T Channel P
# 1.24.3.1 1 24.3 1 10.2
# 2.23.4.1 2 23.4 1 10.4
# 3.22.1.1 3 22.1 1 10.5
# 4.19.9.1 4 19.9 1 10.2
# 1.24.3.2 1 24.3 2 5.5
# 2.23.4.2 2 23.4 2 5.7
# 3.22.1.2 3 22.1 2 5.9
# 4.19.9.2 4 19.9 2 5.2
# 1.24.3.3 1 24.3 3 2.1
# 2.23.4.3 2 23.4 3 2.8
# 3.22.1.3 3 22.1 3 3.1
# 4.19.9.3 4 19.9 3 2.4
与"tidyr" + "dplyr"
library(dplyr)
library(tidyr)
df %>%
gather(Channel, P, P.1:P.3) %>%
mutate(Channel = gsub("P.", "", Channel))
# ID T Channel P
# 1 1 24.3 1 10.2
# 2 2 23.4 1 10.4
# 3 3 22.1 1 10.5
# 4 4 19.9 1 10.2
# 5 1 24.3 2 5.5
# 6 2 23.4 2 5.7
# 7 3 22.1 2 5.9
# 8 4 19.9 2 5.2
# 9 1 24.3 3 2.1
# 10 2 23.4 3 2.8
# 11 3 22.1 3 3.1
# 12 4 19.9 3 2.4