在R语言中将多行数据转换为带行索引的单列
把宽格式数据框转为按行ID索引的长格式(R语言实现)
下面提供几种简单直接的实现方法,完全匹配你需要的转换效果:
方法1:使用tidyr包的pivot_longer(语法清晰,推荐)
这个方法属于tidyverse生态,代码可读性高,适合日常数据处理:
# 若未安装tidyr包,先执行安装:install.packages("tidyr") library(tidyr) # 构造示例数据 X1 <- c(1,2,3,2,2) X2 <- c(1,2,3,2,2) X3 <- c(1,2,3,3,2) X4 <- c(1,2,2,2,2) X <- data.frame(X1,X2, X3, X4) # 添加行ID列,再转成长格式 X$id <- as.integer(rownames(X)) Y <- pivot_longer(X, cols = starts_with("X"), names_to = NULL, values_to = "Y1") # 查看转换结果 Y
方法2:base R原生实现(无需额外装包)
如果不想加载外部包,可以用base R的基础函数快速完成:
# 构造示例数据 X1 <- c(1,2,3,2,2) X2 <- c(1,2,3,2,2) X3 <- c(1,2,3,3,2) X4 <- c(1,2,2,2,2) X <- data.frame(X1,X2, X3, X4) # 生成重复的行ID(每行对应原数据的4列,所以重复4次) id <- rep(1:nrow(X), each = ncol(X)) # 按行提取所有值(转置后unlist保证顺序正确) Y1 <- unlist(t(X)) # 组合成目标数据框 Y <- data.frame(id, Y1) # 查看结果 Y
方法3:base R的reshape函数
适合习惯传统reshape语法的用户:
# 构造示例数据 X1 <- c(1,2,3,2,2) X2 <- c(1,2,3,2,2) X3 <- c(1,2,3,3,2) X4 <- c(1,2,2,2,2) X <- data.frame(X1,X2, X3, X4) # 添加行ID X$id <- 1:nrow(X) # 转长格式并清理结果 Y <- reshape(X, direction = "long", varying = list(names(X)[1:4]), v.names = "Y1", idvar = "id", times = NULL) Y <- Y[,c("id", "Y1")] rownames(Y) <- NULL # 查看结果 Y
以上三种方法都能得到你需要的目标格式,可根据自己的使用习惯选择。
内容的提问来源于stack exchange,提问作者EB3112
相关产品推荐
相关产品推荐

