如何使用R将多行DataFrame转换为列名组合的单行DataFrame
R语言实现多行DataFrame转单行拼接格式
构造示例数据
先构造和需求一致的原始DataFrame:
df <- data.frame( `1` = c("Apple", "Car", "House"), `2` = c("Orange", "Truck", "Apartment"), `3` = c("Grape", "Plane", "Garage"), row.names = c("A", "B", "C"), check.names = FALSE )
方法1:tidyverse实现(逻辑清晰易修改)
适合已经习惯tidyverse语法的场景,代码可读性高:
library(tidyverse) result <- df %>% # 将行名转为普通列 rownames_to_column("row_id") %>% # 宽表转长表,保留行标识、列标识、对应值 pivot_longer(-row_id, names_to = "col_id", values_to = "val") %>% # 拼接得到新列名 mutate(new_col = paste(col_id, row_id, sep = "_")) %>% # 长表转回宽表,得到单行结果 pivot_wider(names_from = new_col, values_from = val) # 调整行索引为0,和示例格式一致 rownames(result) <- 0
方法2:Base R实现(无需额外依赖)
不需要安装任何第三方包,直接用R原生函数实现:
# 转置原数据后展平,得到按行优先排序的所有值 vals <- as.vector(t(df)) # 生成拼接后的新列名:原列名_原行名 new_cols <- paste(rep(colnames(df), nrow(df)), rep(rownames(df), each = ncol(df)), sep = "_") # 构造单行DataFrame,关闭自动修正列名避免数字开头列被加前缀 result <- data.frame( matrix(vals, nrow = 1, dimnames = list(0, new_cols)), check.names = FALSE )
两种方法运行后得到的result就是目标格式。
内容的提问来源于stack exchange,提问作者coal_canary
相关产品推荐
相关产品推荐

