2016-06-03 4 views
1

Следующий код в R использует цикл for. Каким образом я мог бы решить одну и ту же проблему без цикла for (loop) (возможно, путем векторизации)?R: Как это сделать без петли?

Я смотрю на незнакомый набор данных со многими столбцами (243), и я пытаюсь выяснить, какие столбцы содержат неструктурированный текст. В качестве первой проверки я собирался указать столбцы, которые являются 1) класса «character» и 2) иметь по меньшей мере десять уникальных значений.

openEnded <- rep(x = NA, times = ncol(scaryData)) 
for(i in 1:ncol(scaryData)) { 
    openEnded[i] <- is.character(scaryData[[i]]) & length(unique(scaryData[[i]])) >= 10 
    } 
+1

Возможно, вам удастся избежать циклов и прорисовать это в векторном формате, но на самом деле нужно увидеть небольшой пример ваших данных. Можете ли вы поделиться, например, 'dput (scaryData [1: 5])' please – user20650

ответ

1

Это, вероятно, сделать работу:

openEnded <- apply(scaryData, 2, function(x) is.character(x) & length(unique(x))>=10) 

Из цикла, вы просто итерацию по столбцам (это apply(scaryData, 2) часть) анонимную функцию, которая сочетает в себе два ваших условия (function(x) cond1 & cond2).

Я думаю, что ваши данные являются data.frame, поэтому sapply(scaryData, 2, function(x) ...) также будет работать.

Хороший пост о семье *apply можно найти there.

+2

Спасибо! Это не будет считаться «векторизации» операции, поскольку она явно не использует матричную алгебру, правильно? –

+0

@JohnFogg Нет, это не векторизация. [Этот пост] (http://stackoverflow.com/questions/2275896/is-rs-apply-family-more-than-syntactic-sugar/2276001#2276001) может представлять интерес. – RHertel

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