用 R 重塑 table
Reshaping table with R
我想使用 R 重塑 table。我尝试了 pivot_wider 函数,但没有达到预期的结果。
这是我的 table:
table1 <- structure(list(subjects = c("Group A_subject 1", "Group A_subject 2",
"Group A_subject 3", "Group B_subject 1", "Group B_subject 2"
), age = c(6, 8, 4, 9, 7), whatever = c(10, 12, 15, 16, 19)), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -5L), spec = structure(list(
cols = list(subjects = structure(list(), class = c("collector_character",
"collector")), age = structure(list(), class = c("collector_double",
"collector")), whatever = structure(list(), class = c("collector_double",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1L), class = "col_spec"))
我正在尝试类似下面的操作,但我无法为 names_sep.
设置正确的模式
tableout <- table1 %>%
pivot_wider(names_from = subjects, names_sep = Group *, values_from = age, values_fill = 1)
我是 R 的新手,所以另一个解决方案可能比使用 pivot 更好。
基本上是把原值赋给宽幅的A组和B组。
dput() 的期望输出 - table 是手动创建的
output <- structure(list(subjects = c("subject 1", "subject 2", "subject 3"
), `Group A` = c(6, 8, 4), `Group B` = c(9, 7, NA)), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -3L), spec = structure(list(
cols = list(subjects = structure(list(), class = c("collector_character",
"collector")), `Group A` = structure(list(), class = c("collector_double",
"collector")), `Group B` = structure(list(), class = c("collector_double",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1L), class = "col_spec"))
我们可以使用 separate
然后 pivot_wider
使用 tidyr
和 dplyr
包。都在 tidyverse
library(tidyverse)
df1 <- table1 %>%
select(-whatever) %>%
separate(subjects, c("Group", "Subject"), "_") %>%
pivot_wider(names_from = "Group", values_from= "age")
# Output
# A tibble: 3 x 3
# Groups: Subject [3]
Subject `Group A` `Group B`
<chr> <dbl> <dbl>
1 subject 1 6 9
2 subject 2 8 7
3 subject 3 4 NA
我想使用 R 重塑 table。我尝试了 pivot_wider 函数,但没有达到预期的结果。
这是我的 table:
table1 <- structure(list(subjects = c("Group A_subject 1", "Group A_subject 2",
"Group A_subject 3", "Group B_subject 1", "Group B_subject 2"
), age = c(6, 8, 4, 9, 7), whatever = c(10, 12, 15, 16, 19)), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -5L), spec = structure(list(
cols = list(subjects = structure(list(), class = c("collector_character",
"collector")), age = structure(list(), class = c("collector_double",
"collector")), whatever = structure(list(), class = c("collector_double",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1L), class = "col_spec"))
我正在尝试类似下面的操作,但我无法为 names_sep.
设置正确的模式 tableout <- table1 %>%
pivot_wider(names_from = subjects, names_sep = Group *, values_from = age, values_fill = 1)
我是 R 的新手,所以另一个解决方案可能比使用 pivot 更好。 基本上是把原值赋给宽幅的A组和B组。
dput() 的期望输出 - table 是手动创建的
output <- structure(list(subjects = c("subject 1", "subject 2", "subject 3"
), `Group A` = c(6, 8, 4), `Group B` = c(9, 7, NA)), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -3L), spec = structure(list(
cols = list(subjects = structure(list(), class = c("collector_character",
"collector")), `Group A` = structure(list(), class = c("collector_double",
"collector")), `Group B` = structure(list(), class = c("collector_double",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1L), class = "col_spec"))
我们可以使用 separate
然后 pivot_wider
使用 tidyr
和 dplyr
包。都在 tidyverse
library(tidyverse)
df1 <- table1 %>%
select(-whatever) %>%
separate(subjects, c("Group", "Subject"), "_") %>%
pivot_wider(names_from = "Group", values_from= "age")
# Output
# A tibble: 3 x 3
# Groups: Subject [3]
Subject `Group A` `Group B`
<chr> <dbl> <dbl>
1 subject 1 6 9
2 subject 2 8 7
3 subject 3 4 NA