如何在数据框中将所有非数值转换为R中的NA?

时间:2013-05-12 02:37:45

标签: r

我有一个名为returns的数据框。如何使下面的代码更简洁?我尝试使用apply,lappply和sapply,但它们似乎改变了数据帧的结构,使得我无法生成相关矩阵。澄清:下面的代码有效,但我想使其更简洁。谢谢!

returns$VIT <- as.numeric(as.character(returns$VIT))
returns$EFA <- as.numeric(as.character(returns$EFA))
returns$VWO <- as.numeric(as.character(returns$VWO))
returns$VIG <- as.numeric(as.character(returns$VIG))
returns$VNQ <- as.numeric(as.character(returns$VNQ))
returns$iPath.DJP <- as.numeric(as.character(returns$iPath.DJP))
returns$iShares.MUB <- as.numeric(as.character(returns$iShares.MUB))

cor(returns, use="pairwise.complete.obs")

编辑:以下测试代码不起作用,我试图找出如何使其工作。

test <- data.frame(c(.04,.2,"blah"),c(.01,.24,"blah"))
colnames(test) <- c("VIT", "EFA")

new <- apply(test, 2, function(x) as.numeric(as.character(x)))
cor(test, use="pairwise.complete.obs")

3 个答案:

答案 0 :(得分:0)

test <- data.frame(a = rep("bob", 12), b = rep(c(1,23,4), times = 4))
Filter(is.numeric, test)

仅返回test中的数字列。您可以使用lapply(test, is.numeric)自行获取真/假结果,并使用它做一些事情。

答案 1 :(得分:0)

这是你要找的吗?

numeric.columns <- c('VIT','EFA','VWO','VIG','VNQ','iPath.DJP','iPath.DJP','iShares.MUB')
returns[,numeric.columns] <- lapply(returns[,numeric.columns], function(x) as.numeric(as.character(x)))
cor(returns, use="pairwise.complete.obs")

答案 2 :(得分:0)

只需使用plyr的{​​{1}}。

colwise

它需要一个函数并将其应用于所有列。最终结果应为数字。请注意,这会将returns = colwise(function(x) as.numeric(ifelse(is.numeric(x),x,NA)))(returns) 等值视为NA。