依次将一个数据帧的行分配给不同行的空数据帧,直到填满空数据帧中的所有位置
Sequentially assign rows of one data frame to empty data frames of varying rows, until all positions within empty data frame are filled
我完全是 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].
我不知道从哪里开始,所以我没有代码可以展示。任何帮助将不胜感激!
谢谢!
这段模运算将为您提供行的可能类别 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)
我会尝试这样的事情,可以更简化但这样更透明:
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"
我完全是 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].
我不知道从哪里开始,所以我没有代码可以展示。任何帮助将不胜感激!
谢谢!
这段模运算将为您提供行的可能类别 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)
我会尝试这样的事情,可以更简化但这样更透明:
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"