问题:
如果列名包含字符“ 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")
所需的输出:
ffgmmHg
和ffgcm
均为数字格式,而列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)
并且各列的格式都没有更改
答案 0 :(得分:4)
我们需要在“数据”的grep
上names
。在lapply
内部,我们得到的vector
没有names
。获取索引,然后遍历索引以更改类型
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_at
和matches
选择感兴趣的列并应用功能
data %>%
mutate_at(vars(matches("cm|mmHg")), as.numeric)