2014-02-13 78 views
1

爲示例df構建一個問題導致了第二個問題。第一季度:過濾df列,systemIds +字符+數字,sapply,grepl來過濾結果

問題2:是否有更有效的方法來生成混合數據類型的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))] 

至於第二季度,我沒有很好的建議。你可以嘗試使用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