2013-05-12 167 views
0

我有一个叫做回报的数据框。如何让代码更简洁?我尝试过使用apply,lappply和sapply,但它们似乎改变了数据框的结构,因此我无法生成相关矩阵。澄清:下面的代码有效,但我想使它更简洁。谢谢!如何在数据框中将R中的所有非数值转换为NAs?

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

尝试'应用(返回2,函数(x)as.numeric(as.character(x))'。欢迎来到SO。一般的做法是,如果可以的话,包含一个可重复使用的小例子,这样我们就可以运行你的代码 – 2013-05-12 02:41:00

+0

新建< - 应用(返回2,函数(x)as.numeric(as.character(x)))创建行[1,] [2,]而不是1,2。运行cor(回车,使用=“pairwise.complete.obs”) – user2374133 2013-05-12 02:54:09

+2

具体说明什么是不行的,什么是错误?你在测试时运行的是'cor'并不是新的 – 2013-05-12 03:55:13

回答

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)自己得到真/假的结果,并做一些事情。

+0

谢谢,但不幸的是我而不是试图删除任何非数值的列,而是有些列的条目是非数值的,我想将它们标记为NA,以便我可以得到相关矩阵 – user2374133 2013-05-12 03:38:42

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

返回[,numeric.columns] < - lapply(returns [ ,numeric.columns],函数(x)as.numeric(as.character(x)))不会succ将非数值强制地强制转换为NAs – user2374133 2013-05-12 20:23:00

+1

这很令人惊讶。它对我来说(并且为此发出警告)。你能发布一个我们可以重现的最小数据集吗? – RoyalTS 2013-05-12 23:33:55

+0

我也收到了警告,但是之后没有任何NA。奇怪的是,你的代码能够与我在原始文章中提供的测试代码一起工作,但与真实数据无关。以下是运行您的建议代码后的一行示例返回值:2167 0.016311 0.015539#N/A#N/A#DIV/0! #N/A#N/A 0.005235602 – user2374133 2013-05-13 07:40:09

0

只是使用plyrcolwise

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

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