用数据 R 的每个部分的总和填充 Dataframe 中的空白行
Fill Blank Rows in Dataframe with Sums for each section of data R
我有在数据框中按项目描述和类型分隔的数据。分隔符是空白行,但我想用每个描述的数值总和填充空白行,如果可能的话,在总和下方添加另一个空白行。最好是,我不需要对仅包含一行的数据部分求和 - 请参阅变量 desc“a”,但如果我确实在那里得到总和,那没什么大不了的。
这是我现在拥有的示例:
desc type xvalue yvalue
1 a z 16 1
2
3 b y 17 2
4 b y 18 3
5
6 c x 19 4
7 c x 20 5
8 c x 21 6
9
10 d x 22 7
11 d x 23 8
12
13 d y 24 9
14 d y 25 10
我要找的是与此类似的输出。
desc type xvalue yvalue
1 a z 16 1
2
3 b y 17 2
4 b y 18 3
5 35 5
6
7 c x 19 4
8 c x 20 5
9 c x 21 6
10 40 15
11
12 d x 22 7
13 d x 23 8
14 45 15
15
16 d y 24 9
17 d y 25 10
18 49 19
我在一列而不是一行中找到了关于如何执行此操作的答案。 Adding column of summed data by group with empty rows with R
我使用了 acylam 对这个问题的 dplyr 答案 Add blank rows in between existing rows 来创建空行。我稍微更改了代码以更好地适应我的数据,所以我的代码是:
library(dplyr)
df %>%
split(df$id, df$group) %>%
Map(rbind, ., "") %>%
do.call(rbind, .)
我希望我可以在上面的 do.call(rbind...) dplyr 代码中添加选项。
根据您的数据组织方式,我们可以这样做:
假设空行是 NA
(如果不是,例如它们是空白的,我们可以将它们设为 NA
)
我们在分组后使用 group_split()
,得到一个列表,然后使用看门人的 adorn_totals
在列表上迭代 map_df
library(dplyr)
library(janitor)
df %>%
na.omit() %>% # maybe you don't need this line
group_by(desc, type) %>%
group_split() %>%
purrr::map_df(., janitor::adorn_totals)
desc type xvalue yvalue
a z 16 1
Total - 16 1
b y 17 2
b y 18 3
Total - 35 5
c x 19 4
c x 20 5
c x 21 6
Total - 60 15
d x 22 7
d x 23 8
Total - 45 15
d y 24 9
d y 25 10
Total - 49 19
数据:
structure(list(desc = c("a", NA, "b", "b", NA, "c", "c", "c",
NA, "d", "d", NA, "d", "d"), type = c("z", NA, "y", "y", NA,
"x", "x", "x", NA, "x", "x", NA, "y", "y"), xvalue = c(16L, NA,
17L, 18L, NA, 19L, 20L, 21L, NA, 22L, 23L, NA, 24L, 25L), yvalue = c(1L,
NA, 2L, 3L, NA, 4L, 5L, 6L, NA, 7L, 8L, NA, 9L, 10L)), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
"14"))
这是添加空行并从@TarJae 的回答中删除 janitor's
添加内容的完整答案:
library(dplyr)
library(janitor)
df <- df %>%
na.omit() %>% # maybe you don't need this line
group_by(desc, type) %>%
group_split() %>%
purrr::map_df(., \(x) {x <- x %>% janitor::adorn_totals() %>% rbind(NA)}) %>%
mutate(
desc = ifelse(desc == "Total", NA, desc),
type = ifelse(type == "-", NA, type)
)
我有在数据框中按项目描述和类型分隔的数据。分隔符是空白行,但我想用每个描述的数值总和填充空白行,如果可能的话,在总和下方添加另一个空白行。最好是,我不需要对仅包含一行的数据部分求和 - 请参阅变量 desc“a”,但如果我确实在那里得到总和,那没什么大不了的。
这是我现在拥有的示例:
desc type xvalue yvalue
1 a z 16 1
2
3 b y 17 2
4 b y 18 3
5
6 c x 19 4
7 c x 20 5
8 c x 21 6
9
10 d x 22 7
11 d x 23 8
12
13 d y 24 9
14 d y 25 10
我要找的是与此类似的输出。
desc type xvalue yvalue
1 a z 16 1
2
3 b y 17 2
4 b y 18 3
5 35 5
6
7 c x 19 4
8 c x 20 5
9 c x 21 6
10 40 15
11
12 d x 22 7
13 d x 23 8
14 45 15
15
16 d y 24 9
17 d y 25 10
18 49 19
我在一列而不是一行中找到了关于如何执行此操作的答案。 Adding column of summed data by group with empty rows with R
我使用了 acylam 对这个问题的 dplyr 答案 Add blank rows in between existing rows 来创建空行。我稍微更改了代码以更好地适应我的数据,所以我的代码是:
library(dplyr)
df %>%
split(df$id, df$group) %>%
Map(rbind, ., "") %>%
do.call(rbind, .)
我希望我可以在上面的 do.call(rbind...) dplyr 代码中添加选项。
根据您的数据组织方式,我们可以这样做:
假设空行是 NA
(如果不是,例如它们是空白的,我们可以将它们设为 NA
)
我们在分组后使用 group_split()
,得到一个列表,然后使用看门人的 adorn_totals
map_df
library(dplyr)
library(janitor)
df %>%
na.omit() %>% # maybe you don't need this line
group_by(desc, type) %>%
group_split() %>%
purrr::map_df(., janitor::adorn_totals)
desc type xvalue yvalue
a z 16 1
Total - 16 1
b y 17 2
b y 18 3
Total - 35 5
c x 19 4
c x 20 5
c x 21 6
Total - 60 15
d x 22 7
d x 23 8
Total - 45 15
d y 24 9
d y 25 10
Total - 49 19
数据:
structure(list(desc = c("a", NA, "b", "b", NA, "c", "c", "c",
NA, "d", "d", NA, "d", "d"), type = c("z", NA, "y", "y", NA,
"x", "x", "x", NA, "x", "x", NA, "y", "y"), xvalue = c(16L, NA,
17L, 18L, NA, 19L, 20L, 21L, NA, 22L, 23L, NA, 24L, 25L), yvalue = c(1L,
NA, 2L, 3L, NA, 4L, 5L, 6L, NA, 7L, 8L, NA, 9L, 10L)), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
"14"))
这是添加空行并从@TarJae 的回答中删除 janitor's
添加内容的完整答案:
library(dplyr)
library(janitor)
df <- df %>%
na.omit() %>% # maybe you don't need this line
group_by(desc, type) %>%
group_split() %>%
purrr::map_df(., \(x) {x <- x %>% janitor::adorn_totals() %>% rbind(NA)}) %>%
mutate(
desc = ifelse(desc == "Total", NA, desc),
type = ifelse(type == "-", NA, type)
)