2013-05-12 2 views
0

У меня есть dataframe, называемый return. Как сделать код ниже более кратким? Я пробовал использовать apply, lappply и sapply, но они, похоже, меняют структуру DataFrame таким образом, что я не могу создать корреляционную матрицу. Чтобы уточнить: приведенный ниже код работает, но я хотел бы сделать его более кратким. Благодаря!Как преобразовать все нечетные значения в NA в R в фрейме данных?

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

EDIT: Следующий тестовый код НЕ работает, я пытаюсь выяснить, как заставить его работать.

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

Попробуйте 'apply (return, 2, function (x) as.numeric (as.character (x))'. Добро пожаловать в SO. Это общая практика, когда вы можете включить небольшой воспроизводимый пример, чтобы мы могли запустите свой код. –

+0

Выполнение нового <- apply (возвращает, 2, function (x) as.numeric (as.character (x))) создает строки [1,] [2,] вместо 1,2. И я не могу run cor (return, use = "pairwise.complete.obs") – user2374133

+2

Будьте конкретны. Что не работает. В чем ошибка? Плюс вы используете 'cor' on test not new. –

ответ

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

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 (возвращает [ , numeric.columns], function (x) as.numeric (as.character (x))) не succ эссенциально принуждают ненужные ценности к НС – user2374133

+1

Это удивительно. Это для меня (и бросить предупреждение об этом). Можете ли вы опубликовать минимальный набор данных, на котором мы могли бы воспроизвести это? – RoyalTS

+0

Я также получаю предупреждение, но после этого нет никаких НС. Как ни странно, ваш код работает с тестовым кодом, который я представил в исходном сообщении, но не с реальными данными. Вот пример строки результатов после запуска вашего предлагаемого кода: 2167 0.016311 0.015539 # N/A # N/A # DIV/0! # N/A # N/A 0.005235602 – user2374133

0

Просто используйте plyr «s colwise.

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

Он принимает функцию и применяет ее ко всем столбцам. Конечный результат должен быть числовым. Обратите внимание, что это относится к значениям, таким как '1' как NA.

Смежные вопросы