顺序地将一个数据帧的行分配给不同行的空数据帧,直到填充空数据帧内的所有位置

时间:2015-11-22 21:51:28

标签: r algorithm dataframe sequence subset

我是R的完全新手,而且我还没有能够解决这个问题。我花了好几个小时试图这样做,没有运气。我正在尝试执行以下操作。

  • 我有一个数据框 df_main ,有25行,等级排序。
  • 我有3个空数据框,每个数据行的行数不同( df_1 = 9行, df_2 = 13行, df_3 < / strong> = 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,29,21,22,23,24,25]和df_3(3行)应该有以下行df_main [3,6,9]。

我不知道从哪里开始,所以我没有代码可以显示。任何帮助将不胜感激!

谢谢!

2 个答案:

答案 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)

答案 1 :(得分: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",]

我没有机会测试这段代码,但我希望有助于更接近解决方案。

,大卫。

编辑:

嗨Nathan,我想这有点取决于n_1个空数据帧是如何呈现的。最后,您需要从空数据框中获得的唯一信息是行数(除非不允许每一行保存新数据)。如果每个行都有这么多行,那么实际创建空数据框就更容易了:

首先,模拟一些数据:

n <- 2000
n_1 <- 20

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

在空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 = "_" ))))
}))

没有结束

现在创建分发列表就像:

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 )] )

最后,将数据帧放在全局环境中:

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"