如何将仅数据框中的某些列转换为数字?
例如,我有这个数据框:
structure(list(airport = c("EGLL", "EGLL"), xdate = c("2016-07-28",
"2016-07-31"), ws = c("6", "5"), wd = c("237", "299"), humidity = c("68",
"55")), .Names = c("airport", "xdate", "ws", "wd", "humidity"
), row.names = 1:2, class = "data.frame")
Run Code Online (Sandbox Code Playgroud)
我只是想转换ws,wd以及humidity以数字,不是 airport and xdate。
如果我这样做:
columns <- sapply(weatherDF, is.character)
weatherDF[, columns] <- lapply(weatherDF[, columns, drop = FALSE], function(x) as.numeric(as.character(x)))
Run Code Online (Sandbox Code Playgroud)
我正在转换airport并转换xdate为数字,然后收到此警告:
Warning messages:
1: In FUN(X[[i]], ...) : NAs introduced by coercion
2: In FUN(X[[i]], ...) : NAs introduced by coercion
Run Code Online (Sandbox Code Playgroud)
现在,我的数据框变为:
structure(list(airport = c(NA_real_, NA_real_), xdate = c(NA_real_,
NA_real_), ws = c(6, 5), wd = c(237, 299), humidity = c(68, 55
)), .Names = c("airport", "xdate", "ws", "wd", "humidity"), row.names = 1:2, class = "data.frame")
Run Code Online (Sandbox Code Playgroud)
有什么想法可以正确转换它们吗?
使用dplyr:
library(dplyr)
df %>%
mutate_at(vars(ws, wd, humidity), as.numeric)
# A tibble: 2 x 5
airport xdate ws wd humidity
<chr> <chr> <dbl> <dbl> <dbl>
1 EGLL 2016-07-28 6. 237. 68.
2 EGLL 2016-07-31 5. 299. 55.
Run Code Online (Sandbox Code Playgroud)
num.cols <- c('ws','wd','humidity')
weatherDF[num.cols] <- sapply(weatherDF[num.cols], as.numeric)
Run Code Online (Sandbox Code Playgroud)
1)你全columns是character
columns <- sapply(weatherDF, is.character)
airport xdate ws wd humidity
TRUE TRUE TRUE TRUE TRUE
Run Code Online (Sandbox Code Playgroud)
2)为什么不简单?
weatherDF[, 3:ncol(weatherDF)] <- lapply(3:ncol(weatherDF), function(x) as.numeric(weatherDF[[x]]))
要么
columns <-c("ws", "wd", "humidity")
weatherDF[, columns] <- lapply(columns, function(x) as.numeric(weatherDF[[x]]))
Run Code Online (Sandbox Code Playgroud)
如果您不知道哪几列是数字,则可以尝试使用tryCatch
如下方式找到它
weatherDF[,1:ncol(weatherDF)]=lapply(1:ncol(weatherDF),function(x) {
tryCatch({
as.numeric(weatherDF[[x]])
},warning = function(w) {
weatherDF[[x]]}
)} )
Run Code Online (Sandbox Code Playgroud)