如何将数据框架中的所有非数字值转换为R中的NAs



我有一个名为returns的数据框架。如何使下面的代码更简洁?我尝试使用apply, lapply和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")
test <- data.frame(a = rep("bob", 12), b = rep(c(1,23,4), times = 4))
Filter(is.numeric, test)

只返回test中的数字列。你可以使用lapply(test, is.numeric)来得到正确/错误的结果,并做一些事情。

这是你要找的吗?

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

就用plyrcolwise

returns = colwise(function(x) as.numeric(ifelse(is.numeric(x),x,NA)))(returns)

它接受一个函数并将其应用于所有列。最终结果应该是数字。注意,这会将'1'等值视为NA。

最新更新