2016-01-12 18 views
1

分割多列的數據幀我有超過4000列的數據幀。列顯示庫存數據並且缺少值。數據框有各種缺失值,因爲數據框中有公司目前在證券交易所上市/交易,以及過去在證券交易所交易過的公司。如果公司A有2000年的收盤價格數據,但公司B可能沒有2000年的任何數據,因爲B公司在2000年未進行交易/上市,因此缺少價值。這使得我的數據框非常複雜,並且由於缺少數據而難以運行諸如自迴歸(Autoregressive)之類的模型。所以,我想根據它們之間的常見缺失值(列)拆分/子集這個數據框,然後刪除這些NAs並運行模型。我說明如下如何子集和/受可用值的公共數中的R

df 
DATE   A  B C  D  E F G H 
31/12/1999 79.5 NA NA  36.7 3 6 NA NA 
03/01/2000 79.5 NA NA  36.7 3 6 NA NA 
04/01/2000 79.5 NA 325  36.7 3 6 961 3081.9 
05/01/2000 79.5 NA 322.5 38.8 3 6 945 2524.7 
06/01/2000 79.5 NA 327.5 20.3 3 6 952 3272.3 
07/01/2000 79.5 NA 327.5 15.6 3 6 941 2102.9 
10/01/2000 79.5 7 327.5 5.4  3 6 946 2901.5 
11/01/2000 79.5 7 327.5 15  3 6 888 9442.5 
12/01/2000 79.5 7 331.5 9.3  3 6 870 7865.8 
13/01/2000 79.5 7 334  29.1 3 6 853 7742.1 

我想有dataframes如下數據和所需的輸出:

d1<-df 
DATE   A  D  E F 
31/12/1999 79.5 36.7 3 6 
03/01/2000 79.5 36.7 3 6 
04/01/2000 79.5 36.7 3 6 
05/01/2000 79.5 38.8 3 6 
06/01/2000 79.5 20.3 3 6 
07/01/2000 79.5 15.6 3 6 
10/01/2000 79.5 5.4  3 6 
11/01/2000 79.5 15  3 6 
12/01/2000 79.5 9.3  3 6 
13/01/2000 79.5 29.1 3 6 
df2<- df 
DATE   C  G H 
31/12/1999 NA  NA NA 
03/01/2000 NA  NA NA 
04/01/2000 325  961 3081.9 
05/01/2000 322.5 945 2524.7 
06/01/2000 327.5 952 3272.3 
07/01/2000 327.5 941 2102.9 
10/01/2000 327.5 946 2901.5 
11/01/2000 327.5 888 9442.5 
12/01/2000 331.5 870 7865.8 
13/01/2000 334  853 7742.1 

df3 <- df 
DATE B 
31/12/1999 NA 
03/01/2000 NA 
04/01/2000 NA 
05/01/2000 NA 
06/01/2000 NA 
07/01/2000 NA 
10/01/2000 7 
11/01/2000 7 
12/01/2000 7 
13/01/2000 7 

我會很感激你在這方面的幫助。

+1

一個假設你最初把這個'data.frame'從其他數據源首先放在一起。也許你應該重新設計這個過程而重新設計這個過程。 –

+0

這就是說,根據你的描述,這聽起來像每列都採用以下形式:'c(rep(NA,n1),,rep(NA,n2))'其中'n1'和'n2'可以是任意長度> = 0.'apply(df,2,function(j)range(is.na(j)))'應該給你'n1','n2'的邊界,這應該允許你智能地做子集 –

+0

我有從一個來源獲得我的數據集,但這是我樣本中最複雜的部分,各樣公司在樣本期間已被列入和摘牌,我必須對其中的每一個進行說明。 – Aquarius

回答

2

這應該工作到你在做什麼,以及它產生的數據的列表框,你可以索引一次一個:

c <- sapply(df[, 2:ncol(df)], function(x) sum(!is.na(x))) 
x <- sapply(unique(c), function(x) which(x == c)) 
dfList <- list(); for(i in 1:length(x)) {dfList[[i]] <- df[, c(1, as.numeric(x[[i]]) + 1)]} 

輸出如下:

dfList 
[[1]] 
     DATE A D E F 
1 31/12/1999 79.5 36.7 3 6 
2 03/01/2000 79.5 36.7 3 6 
3 04/01/2000 79.5 36.7 3 6 
4 05/01/2000 79.5 38.8 3 6 
5 06/01/2000 79.5 20.3 3 6 
6 07/01/2000 79.5 15.6 3 6 
7 10/01/2000 79.5 5.4 3 6 
8 11/01/2000 79.5 15.0 3 6 
9 12/01/2000 79.5 9.3 3 6 
10 13/01/2000 79.5 29.1 3 6 

[[2]] 
     DATE B 
1 31/12/1999 NA 
2 03/01/2000 NA 
3 04/01/2000 NA 
4 05/01/2000 NA 
5 06/01/2000 NA 
6 07/01/2000 NA 
7 10/01/2000 7 
8 11/01/2000 7 
9 12/01/2000 7 
10 13/01/2000 7 

[[3]] 
     DATE  C G  H 
1 31/12/1999 NA NA  NA 
2 03/01/2000 NA NA  NA 
3 04/01/2000 325.0 961 3081.9 
4 05/01/2000 322.5 945 2524.7 
5 06/01/2000 327.5 952 3272.3 
6 07/01/2000 327.5 941 2102.9 
7 10/01/2000 327.5 946 2901.5 
8 11/01/2000 327.5 888 9442.5 
9 12/01/2000 331.5 870 7865.8 
10 13/01/2000 334.0 853 7742.1 

要從上面的數據幀列表中的每個數據幀中檢索完整情況,您可以執行:

dfList <- sapply(dfList, function(x) x[complete.cases(x), ]) 

輸出結果將在這個例子中,三個數據幀的以下列表:

[[1]] 
     DATE A D E F 
1 31/12/1999 79.5 36.7 3 6 
2 03/01/2000 79.5 36.7 3 6 
3 04/01/2000 79.5 36.7 3 6 
4 05/01/2000 79.5 38.8 3 6 
5 06/01/2000 79.5 20.3 3 6 
6 07/01/2000 79.5 15.6 3 6 
7 10/01/2000 79.5 5.4 3 6 
8 11/01/2000 79.5 15.0 3 6 
9 12/01/2000 79.5 9.3 3 6 
10 13/01/2000 79.5 29.1 3 6 

[[2]] 
     DATE B 
7 10/01/2000 7 
8 11/01/2000 7 
9 12/01/2000 7 
10 13/01/2000 7 

[[3]] 
     DATE  C G  H 
3 04/01/2000 325.0 961 3081.9 
4 05/01/2000 322.5 945 2524.7 
5 06/01/2000 327.5 952 3272.3 
6 07/01/2000 327.5 941 2102.9 
7 10/01/2000 327.5 946 2901.5 
8 11/01/2000 327.5 888 9442.5 
9 12/01/2000 331.5 870 7865.8 
10 13/01/2000 334.0 853 7742.1 

如下您可以訪問這些數據幀:

for (i in 1:lenght(dfList)) {dfList[[i]]} 
+0

謝謝。但是我需要以數據框的形式存在,所以我可以運行自迴歸模型。 – Aquarius

+0

他們是數據框....你只需要遍歷列表中的每個元素來運行你的模型:for(我在1:lenght(dfList)){在dfList [[i]]上運行你的模型) – Gopala

+0

Kindly你能告訴我如何檢查已創建多少個數據幀 – Aquarius

1

使用data.table包將整個事物轉換爲data.table。

然後使用data.table[]的第一個參數來對列和行進行子集劃分。

例如dt[!is.na(A) & !is.na(D) & !is.na(E) & !is.na(F), .(A,D,E,F)]應該給你你的第一張表。

能幫你更加明確的規則,使各分表?

+0

謝謝。但是我的數據框中有超過4000家公司(列)。我無法提供每個組件的名稱。 NA是我需要遵循的基本規則來形成數據框,因爲那樣我將在結果數據框中用NAs刪除這些行。 – Aquarius

+0

你不需要。但是使用data.table來做到這一點。這實際上是它的設計目的:https://cran.r-project.org/web/packages/data.table/vignettes/datatable-intro.pdf – DaveRGP

+0

您的目標只是要刪除所有NA?如果是這樣,爲什麼你有多個輸出表? – DaveRGP

1

首先calcualte的NAS使用適用於每一列數:

gr <- apply(df ,2 ,function(x) sum(is.na(x))) 
gr 
DATE A B C D E F G H 
    0 0 6 2 0 0 0 2 2 

現在你可以子集的data.frame和指定的閾值,給你 您所需的輸出。

df[, c("DATE",colnames(df)[gr==0]) ] 
df[, c("DATE",colnames(df)[gr>0 & gr<=5 ]) ] 
df[, c("DATE",colnames(df)[gr>5]) ] 
+0

由於沒有閾值,因此這不起作用。只需匹配每個唯一數量的NAs的列即可。 – Gopala

+0

謝謝你的回答,但我沒有門檻。 – Aquarius

2

還有一個解決方案:)

# always give reproducible example 
df <- data.frame(A=LETTERS[1:10], 
       B=c(rep(NA, 8), 1:2), 
       C=c(rep(NA, 6), 1:4), 
       D=c(rep(NA, 6), 5:8)) 

# get indices of NAs in each column 
l <- lapply(df, function(i) which(is.na(i))) 

# create factors to group columns with identical NA indices 
# this is stupid and could be inefficient for data.frames with lots of NA values in columns 
f <- factor(sapply(l, paste, collapse=",")) 

# split initial data.frame on a list of data.frames 
list_of_dfs <- lapply(levels(f), function(fl) df[, which(f == fl), drop = FALSE]) 
+0

謝謝你的回答。但有可能,而不是列表我得到的數據幀,因爲我必須朗姆酒自動迴歸模型。 – Aquarius

相關問題