我有一个包含300列的数据框,其中有一个字符串变量,我试图删除它。我使用lapply
(见下文)在堆栈溢出中找到了这个解决方案,这是我想做的,但是使用dplyr
包。我尝试过使用mutate_each
函数但似乎无法使其正常工作
“如果您的数据框(df)实际上是除了NAs和垃圾之外的所有整数,那么以下内容将对其进行转换。
df2 <- data.frame(lapply(df, function(x) as.numeric(as.character(x))))
你会对强制引入的NAs发出警告,但这只是所有那些非数字字符串转变为NA。
答案 0 :(得分:4)
dplyr
0.5现在包含select_if()
功能。
例如:
person <- c("jim", "john", "harry")
df <- data.frame(matrix(c(1:9,NA,11,12), nrow=3), person)
library(dplyr)
df %>% select_if(is.numeric)
# X1 X2 X3 X4
#1 1 4 7 NA
#2 2 5 8 11
#3 3 6 9 12
当然,如有必要,您可以添加更多条件。
答案 1 :(得分:2)
如果你想使用这行代码:
df2 <- data.frame(lapply(df, function(x) as.numeric(as.character(x))))
dplyr
(我假设你的意思是“使用管道”)最简单的是
df2 = df %>% lapply(function(x) as.numeric(as.character(x))) %>%
as.data.frame
将此“翻译”为mutate_each
成语:
mutate_each(df, funs(as.numeric(as.character(.)))
此函数当然会将所有列转换为字符,然后转换为数字。要提高效率,请不要在已经为数字的列上进行两次转换:
mutate_each(df, funs({
if (is.numeric(.)) return(.)
as.numeric(as.character(.))
}))
测试数据:
df = data.frame(v1 = 1:10, v2 = factor(11:20))
答案 2 :(得分:0)
mutate_all 在这里工作,只需将gsub包装在一个函数中。 (我还假设你不一定是字符串搜索,而不是拖网搜索非整数。
StrScrub <- function(x) {
as.integer(gsub("^\\D+$",NA, x))
}
ScrubbedDF <- mutate_all(data, funs(StrScrub))
示例数据框:
library(dplyr)
options(stringsAsFactors = F)
data = data.frame("A" = c(2:5),"B" = c(5,"gr",3:2), "C" = c("h", 9, "j", "1"))
的参考/帮助