我的数据格式如下
-------------------------
| 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,但是我很新,我还没有找到合适的函数来执行此操作。感谢您的投入。
答案 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