R中归并的一种“特殊”情况

0x6upsns  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(128)

我是一个相当没有经验的R用户,面临以下问题:
我想合并两个数据表dt 1和dt 2。dt 1包含1个名为Assessment的变量。dt 2包含2个名为ID和Frequency的变量。现在,我还想在dt 2中包含Assessment观察结果。
为简单起见,请考虑以下示例:

library(dplyr)
library(data.table)

dt1 <- data.table(c("perfect", "perfect", "okay", "unsufficient", "good", "good", "okay", "perfect"))
colnames(dt1) <- "Assessment"

dt2 <- data.table(cbind(c(1,2,3,4,5,6),c(1,3,1,1,1,1)))
colnames(dt2) <- c("ID", "Frequency")

因此,dt 1如下所示:
| 评估|
| - ------|
| 完全的|
| 完全的|
| 好的|
| 不充分的|
| 良好|
| 良好|
| 好的|
| 完全的|
dt 2看起来像这样:
| 识别号|频率|
| - ------|- ------|
| 1个|1个|
| 第二章|三个|
| 三个|1个|
| 四个|1个|
| 五个|1个|
| 六个|1个|
我的目标是得到这样的东西:
| 识别号|频率|评估|
| - ------|- ------|- ------|
| 1个|1个|完全的|
| 第二章|三个|完美的;好的不充分的|
| 三个|1个|良好|
| 四个|1个|良好|
| 五个|1个|好的|
| 六个|1个|完全的|
我不知道如何来到这里,非常感谢每一个帮助!谢谢!

polhcujo

polhcujo1#

dt1 %>% 
  bind_cols(
    dt2 %>% 
      uncount(Frequency) 
  ) %>% 
  group_by(ID) %>% 
  summarise(Assessment = paste0(Assessment,collapse = ";"))

# A tibble: 6 x 2
     ID Assessment               
  <dbl> <chr>                    
1     1 perfect                  
2     2 perfect;okay;unsufficient
3     3 good                     
4     4 good                     
5     5 okay                     
6     6 perfect
8iwquhpp

8iwquhpp2#

如果您相信正确的顺序,如OP中所述,您可以根据ID的频率对其进行rep.int

dt2[dt1[, list(Assessment=toString(Assessment)), by=list(ID=with(dt2, rep.int(ID, Frequency)))], on=.(ID)]
#    ID Frequency                  Assessment
# 1:  1         1                     perfect
# 2:  2         3 perfect, okay, unsufficient
# 3:  3         1                        good
# 4:  4         1                        good
# 5:  5         1                        okay
# 6:  6         1                     perfect

dt2[dt1[, list(Assessment=list(Assessment)), by=list(ID=with(dt2, rep.int(ID, Frequency)))], on=.(ID)]
#    ID Frequency                Assessment
# 1:  1         1                   perfect
# 2:  2         3 perfect,okay,unsufficient
# 3:  3         1                      good
# 4:  4         1                      good
# 5:  5         1                      okay
# 6:  6         1                   perfect

不同之处在于,在第二个版本中,Assessment是一个列表列。

**注意:**如果dt2不包含任何其他内容,则不再需要合并,并简化为

dt1[, list(Assessment=toString(Assessment)), by=list(ID=with(dt2, rep.int(ID, Frequency)))]
#    ID                  Assessment
# 1:  1                     perfect
# 2:  2 perfect, okay, unsufficient
# 3:  3                        good
# 4:  4                        good
# 5:  5                        okay
# 6:  6                     perfect

相关问题