R语言如何将数据框列表df_list中各df的Measures列转为数值类型
问题描述
现有存储多个数据框(df)的列表对象df_list,需要将列表内每个数据框的Measures列转换为数值(numeric)类型。
该列表由初始数据框拆分得到,拆分后绝大多数新数据框的Measures列本身为数值类型,但少数数据框的该列仅包含NA值,列类型未知。
可复现示例代码如下:
df <- data.frame( "Sample" = c("Air", "Air", "Air", "Air","Air", "Air", "Air", "Air"), "Date" = c("1980", "1980", "2000", "2010", "1980", "1990", "2000", "2010"), "Measures" = c(NA, NA, 484, 221, NA, 131, 417, 476), "Locality" = c("Paris", "Lyon", "Paris", "Lyon", "Paris", "Lyon", "Paris", "Lyon"), "Less.Than" = c("<","<","","<","","","<",""), "Uncertainty" = c(NA,NA,45,NA,10,8,NA,71), "Nuclides" = c("K-40","K-40", "K-40", "K-40", "C-14", "C-14", "C-14", "C-14")) df_list <- split(df,list(df$Sample,df$Date), drop=TRUE)
实现方案
不需要额外做类型判断,直接遍历列表对每个子数据框的Measures列做数值转换即可,as.numeric()函数可以兼容全NA的列,自动将其转换为数值类型的缺失值向量,不会报错。
基础R方案(无第三方依赖)
直接用lapply遍历列表完成转换,不需要加载任何扩展包:
df_list <- lapply(df_list, function(df_item) { df_item$Measures <- as.numeric(df_item$Measures) df_item })
转换完成后可以运行以下代码验证所有子列的类型:
sapply(df_list, \(x) class(x$Measures))
运行后所有返回值均为numeric,说明转换完成。
tidyverse方案
如果日常使用tidyverse生态操作数据,也可以用purrr+dplyr实现相同效果:
library(dplyr) library(purrr) df_list <- map(df_list, ~mutate(.x, Measures = as.numeric(Measures)))
注意事项
- 无需提前筛除全NA的列或者判断列类型,
as.numeric()对逻辑型、字符型、整数型存储的全NA向量都能正确转换为数值型NA - 原本就是数值类型的
Measures列经过转换后数值不会发生任何变化,不会影响原有数据
内容的提问来源于stack exchange,提问作者Sylvain
相关产品推荐
相关产品推荐

