0

我有一个名为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")
4

3 回答 3

0

只需使用plyr's colwise

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

它接受一个函数并将其应用于所有列。最终结果应该是数字。请注意,这会处理诸如'1'NA 之类的值。

于 2015-04-28T03:22:21.967 回答
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")
于 2013-05-12T04:54:28.057 回答
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)自己获取真/假结果并对其进行处理。

于 2013-05-12T03:10:53.560 回答