我data
看起来像这样:
data <- structure(list(A = c("1", "1", "1", "A", "10", "10", "B", "200"), B = c("2", "2", "2", "B", "20", "20", "C", "300"), C = c("3","3", "3", "C", "30", "30", "D", "400"), D = c("4", "4", "4", "D", "40", "40", NA, NA)), row.names = c(NA, -8L), class = c("tbl_df","tbl", "data.frame"))
data
> data
# A tibble: 8 x 4
A B C D
<chr> <chr> <chr> <chr>
1 1 2 3 4
2 1 2 3 4
3 1 2 3 4
4 A B C D
5 10 20 30 40
6 10 20 30 40
7 B C D NA
8 200 300 400 NA
这是错误的结合按行,我想分裂data
成3个个子数据(d1
,d2
和d3
)等这样的:
注意:在我的实际情况下d1
,d2
和d3
有所不同nrow()
。我设置nrow(d1) = 3
,nrow(d2) = 2
而nrow(d3) = 1
只是在这个例子简化问题。
d1 <- data.frame(A = rep(1,3), B = rep(2,3), C = rep(3,3), D = rep(4,3))
d2 <- data.frame(A = rep(10,2), B = rep(20,2), C = rep(30,2), D = rep(40,2))
d3 <- data.frame( B = 200, C = 300, D = 400)
> d1
A B C D
1 1 2 3 4
2 1 2 3 4
3 1 2 3 4
> d2
A B C D
1 10 20 30 40
2 10 20 30 40
> d3
B C D
1 200 300 400
然后我可以使用bind_rows
from正确地绑定它们dplyr
bind_rows(d1, d2, d3) %>% as_tibble()
# A tibble: 6 x 4
A B C D
<dbl> <dbl> <dbl> <dbl>
1 1 2 3 4
2 1 2 3 4
3 1 2 3 4
4 10 20 30 40
5 10 20 30 40
6 NA 200 300 400
问题是,我对如何获得困扰d1
,d2
并d3
从data
。
任何帮助将不胜感激!
这是一个tidyverse
解决方案。
process_df
获取数据框并设置列名称,然后删除第一行。
process_df <- function(df, ...) {
df %>%
set_names(slice(., 1)) %>%
select(which(!is.na(names(.)))) %>%
slice(-1)
}
添加仅包含列名称的标题行。
使用rowwise()
和c_across()
按行获取所有列的值。使用它来识别哪些行是标题行。
group_map
将对每个组应用函数,bind_rows
并将结果组合在一起。
data %>%
add_row(!!!set_names(names(.)), .before = 1) %>%
rowwise() %>%
mutate(
group = all(is.na(c_across()) | c_across() %in% names(.))
) %>%
ungroup() %>%
mutate(group = cumsum(group)) %>%
group_by(group) %>%
group_map(process_df) %>%
bind_rows()
#> # A tibble: 6 x 4
#> A B C D
#> <chr> <chr> <chr> <chr>
#> 1 1 2 3 4
#> 2 1 2 3 4
#> 3 1 2 3 4
#> 4 10 20 30 40
#> 5 10 20 30 40
#> 6 NA 200 300 400
!!!
in的用法说明new_row
set_names(names(.))
创建一个命名向量来表示我们要添加的行。但是,add_row
不接受命名向量-它希望将值指定为参数。
这是一个简化的示例。
new_row <- c(speed = 1, dist = 2)
add_row
不接受命名向量,因此这行不通。
cars %>% add_row(new_row, .before = TRUE)
# (Error)
!!!
将解压缩向量作为函数的参数。
cars %>% add_row(!!!new_row, .before = TRUE)
# (Works)
!!!
以上本质上导致以下结果:
cars %>% add_row(speed = 1, dist = 2, .before = TRUE)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句