数据矩形? - 我如何 reshape/collapse 基于唯一标识符的多行数据到 R 中的一个单元格中?
Data rectangling? - How do I reshape/collapse multiple rows of data based on a unique identifier into one cell in R?
我希望获取多行数据并将它们折叠到每个唯一标识符的一个单元格中。我正在处理一个相当混乱、大小适中的数据框,但下面是一个非常简单的示例,说明我要完成的任务:
mydf = data_frame(x=c(rep("A",3),rep("B",3),rep("C",3)),
y=letters[1:9])
mydf
# A tibble: 9 x 2
x y
<chr> <chr>
1 A a
2 A b
3 A c
4 B d
5 B e
6 B f
7 B g
8 B h
9 B i
我想要 运行 一些代码...理想情况下是通过一些 tidyverse
的使用,例如 mydf %>% mutate(y = I'm really not sure, maybe one of the map functions)
然后最终的数据框如下所示:
better = data_frame(x=c("A","B","C"),
y=list(c(letters[1:3]),c(letters[4:6]),c(letters[7:9])))
better
# A tibble: 3 x 2
x y
<chr> <list>
1 A <chr [3]>
2 B <chr [4]>
3 C <chr [3]>
better$y
[[1]]
[1] "a" "b" "c"
[[2]]
[1] "d" "e" "f"
[[3]]
[1] "g" "h" "i"
如前所述,我的数据更大更杂乱,希望最终会出现在 Shiny 应用程序中,因此它需要完全自主,因此需要对可用于完成这项工作的功能有深入的了解。我想它可能需要比 mutate
更多的步骤,可能会创建一个类似于 better
的单独数据框,然后 left_join
将其恢复到原始状态。
谢谢!
我们需要按 summarise
分组,我们将 'y' 包裹在 list
中
out <- mydf %>%
group_by(x) %>%
summarise(y = list(y))
# A tibble: 3 x 2
# x y
# <chr> <list>
#1 A <chr [3]>
#2 B <chr [3]>
#3 C <chr [3]>
out$y
#[[1]]
#[1] "a" "b" "c"
#[[2]]
#[1] "d" "e" "f"
#[[3]]
#[1] "g" "h" "i"
使用 tidyr 的 nest 函数。
library(tidyverse)
mydf %>% nest(-x)
# A tibble: 3 x 2
x data
<chr> <list>
1 A <tibble [3 x 1]>
2 B <tibble [3 x 1]>
3 C <tibble [3 x 1]>
我希望获取多行数据并将它们折叠到每个唯一标识符的一个单元格中。我正在处理一个相当混乱、大小适中的数据框,但下面是一个非常简单的示例,说明我要完成的任务:
mydf = data_frame(x=c(rep("A",3),rep("B",3),rep("C",3)),
y=letters[1:9])
mydf
# A tibble: 9 x 2
x y
<chr> <chr>
1 A a
2 A b
3 A c
4 B d
5 B e
6 B f
7 B g
8 B h
9 B i
我想要 运行 一些代码...理想情况下是通过一些 tidyverse
的使用,例如 mydf %>% mutate(y = I'm really not sure, maybe one of the map functions)
然后最终的数据框如下所示:
better = data_frame(x=c("A","B","C"),
y=list(c(letters[1:3]),c(letters[4:6]),c(letters[7:9])))
better
# A tibble: 3 x 2
x y
<chr> <list>
1 A <chr [3]>
2 B <chr [4]>
3 C <chr [3]>
better$y
[[1]]
[1] "a" "b" "c"
[[2]]
[1] "d" "e" "f"
[[3]]
[1] "g" "h" "i"
如前所述,我的数据更大更杂乱,希望最终会出现在 Shiny 应用程序中,因此它需要完全自主,因此需要对可用于完成这项工作的功能有深入的了解。我想它可能需要比 mutate
更多的步骤,可能会创建一个类似于 better
的单独数据框,然后 left_join
将其恢复到原始状态。
谢谢!
我们需要按 summarise
分组,我们将 'y' 包裹在 list
out <- mydf %>%
group_by(x) %>%
summarise(y = list(y))
# A tibble: 3 x 2
# x y
# <chr> <list>
#1 A <chr [3]>
#2 B <chr [3]>
#3 C <chr [3]>
out$y
#[[1]]
#[1] "a" "b" "c"
#[[2]]
#[1] "d" "e" "f"
#[[3]]
#[1] "g" "h" "i"
使用 tidyr 的 nest 函数。
library(tidyverse)
mydf %>% nest(-x)
# A tibble: 3 x 2
x data
<chr> <list>
1 A <tibble [3 x 1]>
2 B <tibble [3 x 1]>
3 C <tibble [3 x 1]>