将多行合并为一个(R)

时间:2019-06-28 16:39:49

标签: r

我的数据格式如下

-------------------------
| A | a |            1   |
-------------------------
| A | a |            2   |
-------------------------
| A | a |            3   |
-------------------------
| B | b |            1   |
-------------------------
| B | b |            3   |
-------------------------
| B | b |            5   |
-------------------------

基本上,如果第一个键相同,则除最后一个键外的所有列都相同。我想使数据框更紧凑,因此我没有一个观察最后一列的实例,而是有一个数字列表

类似这样的东西:

-------------------------
| A | a |        1,2,3   |
-------------------------
| B | b |        1,3,5   |
-------------------------

我正在学习R中的tidyverse,但是我很新,我还没有找到合适的函数来执行此操作。感谢您的投入。

3 个答案:

答案 0 :(得分:2)

1)列表。这使第三列成为列表,这样列表中的每个元素都包含一个向量。

SELECT * 
FROM table_a 
LEFT  JOIN table_b ON table_a.id = table_b.my_col
LEFT  JOIN table_c ON table_a.id = table_c.my_col

给予:

library(dplyr)
library(tidyr)

DF %>%
  group_by(V1, V2) %>%
  nest %>%
  ungroup

1a)这也可以写成

# A tibble: 2 x 3
  V1    V2    data            
  <fct> <fct> <list>          
1 A     a     <tibble [3 x 1]>
2 B     b     <tibble [3 x 1]>

2)字符另一种可能性是从第三列的数据中创建字符串:

DF %>% nest(V3, .key = "V3")

给予:

library(dplyr)

DF %>%
  group_by(V1, V2) %>%
  summarize(V3 = toString(V3)) %>%
  ungroup

3)sql 上面使用的dplyr。这使用SQL给出类似于(2)的答案。

# A tibble: 2 x 3
  V1    V2    V3     
  <fct> <fct> <chr>  
1 A     a     1, 2, 3
2 B     b     1, 3, 5

给予:

library(sqldf)
sqldf("select V1, V2, group_concat(V3) V3 
       from DF
       group by V1, V2", method = "raw")

注意

将来,请以可重复的形式提供数据,如下所示:

  V1 V2    V3
1  A  a 1,2,3
2  B  b 1,3,5

答案 1 :(得分:1)

按ID列分组,并使用粘贴(带有collapse=",")对数字列进行汇总。这将为您提供一个(字符)列,其中包含每个ID行的数字列表。

require(dplyr)
df<-data.frame(a=c("a","a","a","b","b"),b=c(1,2,3,1,2))
df %>% group_by(a) %>% summarize(b=paste(b,collapse=","))

# A tibble: 2 x 2
  a     b      
  <fct> <chr>  
1 a     1,2,3
2 b     1,2   

答案 2 :(得分:1)

使用R base:

> aggregate(V3~V1+V2, data=DF, paste0, collapse=",")
  V1 V2    V3
1  A  a 1,2,3
2  B  b 1,3,5