2014-02-13 16 views
1

В результате выполнения примера df для вопроса возник второй вопрос. Первый Q2:фильтрация столбцов df, systemIds + chararacter + numeric, sapply, grepl для результата фильтра

Q2: существует ли более эффективный способ генерации df смешанных типов данных? Вот моя попытка:

a<-seq(2218,2221,1) 
b<-rep(58,4) 
s<-rep(22,4) 
d<-sample((100:220),4) 
e<-letters[seq(1:4)] 
f<-gl(4,1,labels="F") 
g<-factor(rep("INSTRUMENT NOT CALIBRATED",4)) 
i<-factor(rep("org/initials",4)) 
t<-data.frame(a,b,s,d,e,f,g,i) 
colnames(t)<-c("bSystemId","cSystemId","lengthdecimal","heightquantity","desc","code","notes","createdBy"); head(t) 
sapply(t,class) 

Q1: Я фильтрации полей кадра данных, но комбинируя операторы фильтра частично изменяет фильтрацию:

В результате этих двух утверждений дает мне результат я хочу:

a<-head(t[sapply(t,is.numeric)]);a 
b<-a[,!grepl("SystemId",names(a))];b 

Могут ли эти утверждения объединяться для получения того же результата? Я пробовал несколько вещей, но никто из них не работает. Пример:

head(t[,!grepl("SystemId",names(t[sapply(t,is.numeric)]))]) 

Благодарим за любые комментарии.

ответ

2

Вы можете сделать это (на самом деле, очень незначительные изменения в код):

t[sapply(t,is.numeric) & !grepl("SystemId",names(t))] 

Что касается Q2, я не большие предложения. Вы можете попробовать использовать replicate, чтобы создать список случайных вещей, а затем mapply его со списком as функций. Например (непроверенный):

df <- as.data.frame(
    mapply(
    function(fun, col) fun(col), 
    list(as.character, as.numeric, as.factor, as.logical, as.numeric), 
    replicate(5, sample(1:10), simplify=F), 
    SIMPLIFY=F 
), 
    stringsAsFactors=F 
) 
names(df) <- paste0("V", 1:ncol(df)) 
sapply(df, class) 
#   V1   V2   V3   V4   V5 
# "character" "numeric" "factor" "logical" "numeric"  
+0

Отлично, спасибо за быстрый ответ. Я завершаю работу со столами из 50 полей, поэтому я всегда ищу улучшения кода. – user2009447

+0

@ user2009447, также, примечание обновленный метод создания кадра данных с разными столбцами – BrodieG

+0

Это аккуратно. Чем больше я использую применяемые функции, тем больше они мне нравятся. – user2009447