在R语言中将宽格式DataFrame转换为长格式的实现方法
解决方案
你可以用R的tidyverse工具包快速完成宽格式到长格式的转换,步骤如下:
1. 加载数据与工具包
首先加载所需包,并构造你的数据框:
library(tidyverse) # 构造你的数据框 df <- structure(list(A = c(6.53920197406645, 6.12380136266864, 8.01553257692446, 4.62636832157394, 7.58222133679378), B = c(6.56200038984423, 6.09642510342734, 7.73715705458708, 4.64560570976, 7.23920390575521), C = c(6.80800376627205, 7.92368949337286, 8.01633247802198, 4.87384339969836, 6.83446360366941), D = c(6.69117551163928, 5.93689715688807, 8.40247900956586, 4.20000164335469, 6.78643597456963), E = c(6.30449572859692, 5.99369984659008, 7.86273536430256, 4.11510456695528, 7.11972911832181), eID = c("hsa:5982", "hsa:3310", "hsa:7849", "hsa:2978", "hsa:7318")), row.names = c("X1053_at", "X117_at", "X121_at", "X1255_g_at", "X1294_at"), class = "data.frame")
2. 转换为指定长格式
运行以下代码完成格式转换:
df_long <- df %>% # 将原行名(探针ID)转为单独列 rownames_to_column(var = "probe_id") %>% # 把A-E列转成长格式,提取列名到group,对应值到value pivot_longer(cols = A:E, names_to = "group", values_to = "value") %>% # 调整列顺序为要求的顺序:group、probe_id、value、eID select(group, probe_id, value, eID) %>% # 保留数值的6位小数,匹配示例格式 mutate(value = round(value, 6))
3. 输出为纯文本格式(可选)
如果需要输出为你示例中的空格分隔文本,执行:
write.table(df_long, file = "result.txt", sep = " ", row.names = FALSE, col.names = FALSE, quote = FALSE)
替代方案(使用reshape2包)
如果你习惯用reshape2,可以这样写:
library(reshape2) df <- rownames_to_column(df, var = "probe_id") df_long <- melt(df, id.vars = c("probe_id", "eID"), variable.name = "group", value.name = "value") df_long <- df_long[, c("group", "probe_id", "value", "eID")] df_long$value <- round(df_long$value, 6)
内容的提问来源于stack exchange,提问作者Nmgh
相关产品推荐
相关产品推荐

