如何在R中将嵌套列表中数据框的a列从字符型转为数值型?
解决嵌套列表中DataFrame的a列从字符型转数值型的问题
错误原因分析
你原代码的问题出在两层嵌套的map使用错误:
- 外层
map遍历列表中的每个DataFrame是正确的,但内层map(.x, function(x){...})是在遍历单个DataFrame的每一列(因为DataFrame本质是列组成的列表),此时x是单个列向量(比如b列、c列),而非整个DataFrame。 - 在单个列向量中执行
x['a'] %<>% as.numeric完全无效:对非a列来说,x['a']会返回NA;对a列本身来说,x就是向量,x['a']是错误的索引方式(向量没有列名索引),导致转换失败,还破坏了原数据结构。
正确实现方法
方法1:直接修改每个DataFrame的a列
使用map遍历列表中的每个DataFrame,直接修改其a列的类型:
library(purrr) library(magrittr) # 生成示例数据 ff = data.frame(a = c('1','2','3'), b = 1:3, c = 5:7) fff = list(ff, ff, ff, ff) # 转换a列为数值型 k = fff %>% map(~{ .x$a = as.numeric(.x$a) .x })
方法2:结合dplyr::mutate更简洁
如果习惯dplyr语法,可以用mutate来修饰列类型,代码更清晰:
library(purrr) library(dplyr) k = fff %>% map(~mutate(.x, a = as.numeric(a)))
验证结果
执行后查看转换后的类型与结构:
# 查看第一个DataFrame的a列类型 class(k[[1]]$a) # 输出:[1] "numeric" # 查看数据结构 str(k[[1]]) # 输出: # 'data.frame': 3 obs. of 3 variables: # $ a: num 1 2 3 # $ b: int 1 2 3 # $ c: int 5 6 7
内容的提问来源于stack exchange,提问作者doraemon
相关产品推荐
相关产品推荐

