You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R语言中是否有将DataFrame数据转换为列的函数或代码?

解决方案:将宽格式DataFrame转换为长格式列

当然有办法实现这个需求!在R里,把宽格式数据框(多列存储同类数据)转换为长格式(合并为单列),最常用且简洁的工具是tidyverse包中的pivot_longer()函数,它完全匹配你的场景。

步骤1:复现你的原始数据

先把你提供的DataFrame代码放出来,方便复现问题:

number <- c("no.1","no.2","no.3","no.4","no.5","no.6","no.7","no.8","no.9","no.10")
tp1 <- c("car","car","bicycle","car","walk","walk","bus","subway","subway","subway")
tp2 <- c("bicycle",NA,"bus",NA,"subway",NA,"walk",NA,NA,NA)
tp3 <- c("walk",NA,"subway",NA,NA,"bus",NA,NA,NA,NA)
tp4 <- c("bus","walk",NA,NA,NA,NA,NA,NA,NA,NA)
tp5 <- c("subway",NA,NA,NA,NA,NA,NA,NA,NA,NA)
transport <- data.frame(number,tp1,tp2,tp3,tp4,tp5)

步骤2:使用pivot_longer()转换格式

首先确保你安装并加载了tidyverse包,然后运行转换代码:

# 安装tidyverse(如果还没安装)
install.packages("tidyverse")
library(tidyverse)

# 核心转换代码
transport_long <- transport %>%
  pivot_longer(
    cols = starts_with("tp"),  # 指定要合并的列:所有以tp开头的列
    names_to = "transport_type",  # 可选:把原列名(tp1/tp2等)存到这个新列
    values_to = "mode",  # 合并后的交通方式存到这个列(就是你要的目标列)
    values_drop_na = TRUE  # 自动过滤掉NA值,只保留有效数据
  )

# 查看转换后的结果
print(transport_long)

转换后的结果示例

你会得到类似这样的长格式数据框,每个number对应其所有非NA的交通方式:

# A tibble: 20 × 3
   number transport_type mode   
   <chr>  <chr>          <chr>  
 1 no.1   tp1            car    
 2 no.1   tp2            bicycle
 3 no.1   tp3            walk   
 4 no.1   tp4            bus    
 5 no.1   tp5            subway 
 6 no.2   tp1            car    
 7 no.2   tp4            walk   
 8 no.3   tp1            bicycle
 9 no.3   tp2            bus    
10 no.3   tp3            subway 
# … with 10 more rows

可选:去掉原列名(只保留number和mode)

如果你不需要transport_type列(也就是不需要知道这个交通方式来自tp几),可以修改代码去掉该列:

transport_long_simple <- transport %>%
  pivot_longer(
    cols = starts_with("tp"),
    values_to = "mode",
    values_drop_na = TRUE,
    names_to = NULL  # 不保留原列名
  )

补充:Base R的实现方式

如果你不想用tidyverse包,也可以用Base R的方法实现,不过代码会稍显繁琐:

# 提取每个number对应的非NA交通方式
transport_base <- do.call(rbind, lapply(1:nrow(transport), function(i) {
  data.frame(
    number = transport$number[i],
    mode = na.omit(transport[i, -1])
  )
}))

# 重置行名
rownames(transport_base) <- NULL

两种方法都能得到你想要的结果,个人更推荐tidyverse的方案,代码可读性更高,处理复杂格式转换也更灵活。

内容的提问来源于stack exchange,提问作者plusICON

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 08:17:37