2015-11-22 14 views
0

對R來說,我是一個完全新手,我一直無法弄清楚這一點。我花了數小時試圖做到這一點,沒有運氣。我正在嘗試做以下事情。按順序將一個數據幀的行分配給不同行的空數據幀,直到填滿空數據幀中的所有位置爲止

  • 我有一個數據幀,df_main,有25行,等級排序。
  • 我有3個空數據幀,其中每一個是具有變化的數量的行的(df_1 = 9行,df_2 = 13行,df_3 = 3行)。

我想按順序將df_main的行分配給df_1,df_2和df_3,直到每個數據幀都有正確的行數。含義:df_main的

  • 行1被分配給df_1 df_main的
  • 行2被分配給df_2 df_main的
  • 行3被分配給df_3 df_main的
  • 第4行被分配給df_1
  • df_main的
  • 第5行被分配給df_2
  • 等等...

因此,df_1( 9行)應該有以下幾行或者df_main [1,4,7,10,12,14,16,18,20],df_2(13行)應該有df_main [2,5,8,11 ,13,15,17,19,21,22,23,24,25]和df_3(3行)應具有以下df_main行[3,6,9]。

我不知道從哪裏開始,所以我沒有代碼顯示。任何幫助將不勝感激!

謝謝!

回答

0

我會嘗試這樣的事情,可以更簡化,但這種方式更加透明:

I <- rbind(
    cbind(rep("df_1",nrow(df_1)), 
     1:nrow(df_1)), 
    cbind(rep("df_2",nrow(df_2)), 
     1:nrow(df_2)), 
    cbind(rep("df_3",nrow(df_3)), 
     1:nrow(df_3))) 
I <- I [order(I[,2],I[,1]),] 
df_main <- cbind(df_main, I[1:nrow(df_main),]) 

,現在你可以輕鬆的行提取到獨立的DFS:

df_1 <- df_main [df_main$v1 == "df_1",] 

我沒有機會測試此代碼,但我希望它有助於獲得更接近的解決方案。

,David。

編輯:

嗨森,我想這取決於N_1空數據幀如何展示自己一點點。最後,從空數據框中需要的唯一信息是行數(除非不允許每行保存新數據)。如果你有一個行數爲每更容易實際創建空的數據幀:

首先,模擬了一些數據:

n <- 2000 
n_1 <- 20 

df_main <- data.frame (SomeCol = paste ("Some Value", 1:n)) 

製造假rowcounts空DFS:

(rowcounts_of_n_1_dfs <- round (rnorm (n_1, 75, 25))) 

不運行啓動

如果您實際上必須從對象df_1,df_2,..,df_開始,那麼您可以這樣做:

rowcounts_of_n_1_dfs <- unlist (lapply (1:n_1, function (x){ 
    return (nrow (get (paste ("df", x, sep = "_")))) 
})) 

無法運行結束

現在簡單地創建distributionlist爲:

dist <- data.frame (df = rep (1:n_1, rowcounts_of_n_1_dfs), 
        i = unlist (lapply (rowcounts_of_n_1_dfs, seq))) 

神奇的是在排序:

dist <- dist [ with (dist, order(i, df)),] 

只需要分發到df_main用完了:

df_list <- split (df_main, dist$df [ 1:nrow (df_main)]) 

最後,將在全球環境中的dataframes:

數據幀
dummy <- lapply (1:n_1, function (x) { 
    assign (paste ("df", x, sep = "_"), df_list [[ x ]], envir = globalenv()) 
}) 

檢查是否已創建:

ls() 

我得到這個:

[1] "df_1"     "df_10"    "df_11"    "df_12"    "df_13"    "df_14"    
[7] "df_15"    "df_16"    "df_17"    "df_18"    "df_19"    "df_2"     
[13] "df_20"    "df_3"     "df_4"     "df_5"     "df_6"     "df_7"     
[19] "df_8"     "df_9"     "df_list"    "df_main"    "dist"     "dummy"    
[25] "n"     "n_1"     "rowcounts_of_n_1_dfs" 
+0

嗨大衛,這正是我需要它做的。謝謝!還有一個問題。有更多的程序化答案嗎?也就是說,假設我有一個有n行的df_main,我需要按照上述相同的方式將行分配給n_1個數據幀,每個數據幀都有一些行數。你會如何做到這一點? –

+0

嗨Nathan,我想這取決於n_1空白數據框的表現方式。最後,從空數據框中需要的唯一信息是行數(除非不允許每行保存新數據)。查看我的答案更新。 –

+0

太棒了,大衛!非常感謝。你一直非常有幫助。 –

0

模運算的這一點會給你一個可能的類ID爲行:

> 1+ 0:24 %% 3 
[1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 

雖然你沒有提供一個工作實例驗證碼可能在提供一個有用的結果是有效的:

df <- cbind(df, catvar= 1+ 0:24 %% 3) 
df_list <- split(df , df$catvar) 
+0

感謝這但是這並沒有說明每個子數據幀具有不同行數的事實。 –

相關問題