数据矩形? - 如何根据唯一标识符将多行数据重新整形/折叠到R中的一个单元格中?

时间:2018-06-06 18:58:52

标签: r reshape tidyr

我希望获取多行数据,并将每个唯一标识符折叠为一个单元格。我正在处理一个相当混乱,体面的数据框架,但我想要完成的一个非常简单的例子如下:

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它回到原始数据框。

谢谢!

2 个答案:

答案 0 :(得分:1)

我们需要一个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"

答案 1 :(得分:0)

使用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]>