gpt4 book ai didi

r - 如何按 r 中的特定行拆分数据框

转载 作者:行者123 更新时间:2023-12-01 23:42:12 26 4
gpt4 key购买 nike

我有一个 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

按行绑定(bind)是错误的,我想将 data 分成 3 个子数据(d1d2d3 ) 像这样:

注意:在我的真实情况下,d1d2d3有不同的nrow()。我设置nrow(d1) = 3, nrow(d2) = 2 and 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

然后我可以使用 dplyr

中的 bind_rows 正确绑定(bind)它们
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

问题是如何从data<中获取d1d2d3让我很困扰.

任何帮助将不胜感激!

最佳答案

这是一个 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

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)

关于r - 如何按 r 中的特定行拆分数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64854417/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com