使用dplyr,从数据框中删除所有字符串

时间:2015-10-27 23:21:53

标签: r dplyr

我有一个包含300列的数据框,其中有一个字符串变量,我试图删除它。我使用lapply(见下文)在堆栈溢出中找到了这个解决方案,这是我想做的,但是使用dplyr包。我尝试过使用mutate_each函数但似乎无法使其正常工作

“如果您的数据框(df)实际上是除了NAs和垃圾之外的所有整数,那么以下内容将对其进行转换。

df2 <- data.frame(lapply(df, function(x) as.numeric(as.character(x))))

你会对强制引入的NAs发出警告,但这只是所有那些非数字字符串转变为NA。

3 个答案:

答案 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"))

来自Tony Ladson

的参考/帮助