2017-06-20 25 views
-1

所以我試圖找出是否在約20幀數據的列名是相同的。這20個數據幀保存在列表中(Portfolio_snapshots)。我使用的代碼如下 更新:添加minimumm重複的例子,lapply找到,如果各種dataframes的列名是相同的

DF1<- data.frame(v1=rnorm(10),v2=LETTERS[1:5]) 
DF2<- data.frame(v1=rnorm(10),v2=LETTERS[1:5]) 
DF3<- data.frame(v1=rnorm(10),v3=LETTERS[1:5]) 
Portfolio_snapshots = list(DF1,DF2,DF3) 

Df_names <- lapply(Portfolio_snapshots, function(x) { 
     names(as.data.table(x))}) 
lapply(Df_names,function(x) {all.equal((Df_names[1]),(x))}) 

,這並不產生正確的結果。代碼理想情況下應該爲前兩個產生一個TRUE,爲下一個產生一個FALSE。此外,如果有任何的方式來顯示它在哪裏出現不匹配的列名,那麼這將是一個額外的好處。

+0

你的問題可能是? – amonk

+0

嘗試包裝'all.equal'用'isTRUE'如果你只想要一個TRUE/FALSE答案 –

+0

我想這lapply(Df_names,函數(X){IsTrue運算(all.equal((Df_names [1]),(X) ))}),然而,它顯示了所有20個比較的FALSE,而至少應第一個應該是TRUE,因爲它比較Df_names [1]到自身。 – ashleych

回答

0

我想通過減少(intersect,Df_names)是一個很好的解決方案

0

有可能是一個更優雅的方式,但這個工程:

apply(do.call(rbind,lapply(Portfolio_snapshots,colnames)),2,function(x) length(unique(x)) > 1)

這基本上會爲每個數據幀和列名的載體,並認爲,如果有一個以上的唯一的名稱。 它會返回一個布爾值,爲每個列,TRUE如果名稱不同,FALSE如果它們是相同的。