如何将宽格式表格转换为长格式?R语言reshape2包melt函数使用失败求助
First, let's start by recreating your sample data so we're working with the exact same structure:
# Build the sample wide-format data frame data1 <- data.frame( field = c("Subdetail", "Amount", "Percentage Limit"), Fund1 = c("Test", 500, 30), Fund2 = c("Test2", 520, 20), Fund3 = c("Test3", 100, 20), Fund4 = c("Test4", 400, 100), stringsAsFactors = FALSE )
Method 1: Using reshape2::melt() (your original tool)
Your initial code was almost correct—you just need to specify custom names for the melted columns to match your desired output. The variable.name argument lets you rename the fund name column to Name, and value.name keeps the values column labeled value:
library(reshape2) long_data <- melt(data1, id.vars = "field", variable.name = "Name", value.name = "value")
Print the result, and you'll see it matches exactly what you want:
head(long_data) # field Name value # 1 Subdetail Fund1 Test # 2 Amount Fund1 500 # 3 Percentage Limit Fund1 30 # 4 Subdetail Fund2 Test2 # 5 Amount Fund2 520 # 6 Percentage Limit Fund2 20
Method 2: Using tidyr::pivot_longer() (modern tidyverse approach)
If you're using the tidyverse ecosystem, pivot_longer() is a more intuitive and flexible alternative. It lets you explicitly define which columns to reshape, and what to name the resulting columns:
library(tidyr) long_data_tidy <- pivot_longer(data1, cols = -field, # Reshape all columns except 'field' names_to = "Name", values_to = "value")
This produces the exact same output as the melt() method, and it's easier to read for folks familiar with tidyverse syntax.
The reason your original code didn't look like the desired output was just that melt() uses default column names (variable instead of Name)—a quick adjustment to the arguments fixes that completely.
内容的提问来源于stack exchange,提问作者user1464667

