在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
相关产品推荐
相关产品推荐

