根据列名称重新格式化列

标签 r

问题:

如果列的名称包含字符“mmHg”或“cm”,我希望将数据框中的列从字符格式转换为数字格式。

输入

structure(list(ffgmmHg = c("359", "555", "293", "691", "767", 
"974", "785", "736", "862", "259"), ffgcm = c("73", "378", "524", 
"856", "798", "448", "21", "614", "158", "801"), ffgss = c("A", 
"C", "M", "B", "U", "H", "V", "J", "O", "P")), .Names = c("ffgmmHg", 
"ffgcm", "ffgss"), row.names = c(NA, -10L), class = "data.frame")

所需的输出:

ffgmmHgffgcm两者都是数字格式,而列 ffgss将保留为角色。

尝试:

lapply(data, function(x) ifelse(grepl("cm|mmHg",names(x)),as.numeric(as.character(x)),"Nope"))

错误:

没有错误,但我得到的输出是:

$ffgmmHg
logical(0)

$ffgcm
logical(0)

$ffgss
logical(0)

并且列的格式没有改变

最佳答案

我们需要对“数据”的名称进行grep。在lapply中,我们得到了没有name向量。获取索引,然后循环索引改变类型

i1 <- grepl("cm|mmHg", names(data))
data[i1] <- lapply(data[i1], as.numeric)

但是,这可以通过 type.convert 自动完成(假设列都是 character 类 - 这里是 character)

data[] <- lapply(data, type.convert, as.is = TRUE)

或者使用mutate_if

library(dplyr)
data %>%
   mutate_if(i1, as.numeric)

或者从评论(@kath,@FlorianGD)中,mutate_atmatches 来选择感兴趣的列并应用该函数

data %>% 
   mutate_at(vars(matches("cm|mmHg")), as.numeric)

关于根据列名称重新格式化列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52161150/

相关文章:

r - 如何将公式作为参数传递给 r 中的函数?

r - 改变闭包中的变量

r - 避免使用 pivot longer 进行硬编码以一次对多个列进行 pivot

java - sudo R CMD javareconf 报错

r - 如何计算R中每个组与初始值的差异?

r - SublimeREPL : shortcut to pass R code with Sublime Text

r - 使用 DiagrammeR 设计美人鱼图

r - 向 ggmap 添加一堆箭头

r - ggplot2:在绘图少于视口(viewport)的网格上绘图

java - 从 R 传递 java arraylist 对象