2014-02-13 4 views
1

질문에 대한 예제 df를 Buidling하면 두 번째 질문이 나타납니다. 첫 번째 질문 2 :필터링 df columns, 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을 사용하여 임의의 항목 목록을 만든 다음 의 목록을 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