R语言 折叠/合并具有非空单元格/值的多行

e0bqpujr  于 2023-02-20  发布在  其他
关注(0)|答案(2)|浏览(165)

我试图通过一个类似的组合并两行,这是通过查看堆栈溢出的不同问题实现的(Question1Qestion2Question3)。所有这些问题都说明了我想要的,但我的数据框中还有一些空字段,我不想合并它们。我只想合并基于Col1的包含值而不是的相似/重复行空NA。我使用下面的代码,但它也合并单元格是NA

merge_my_rows <- df %>%
  group_by(Col1) %>%
  summarise(Col2 = paste(Col2, collapse = ","))

下面请是样本df和输出df,我想要的。
| 第1列|第2列|
| - ------|- ------|
| F212|爱丽丝|
| 二十三日|约翰|
| 碳六十四|不适用|
| F212|鲍勃|
| 碳六十四|不适用|
| 二十三日|约翰|
| 十九日|侯爵|

输出df

| 第1列|第2列|
| - ------|- ------|
| F212|鲍勃·爱丽丝|
| 二十三日|约翰,约翰|
| 碳六十四|不适用|
| 碳六十四|不适用|
| 十九日|侯爵|

jgwigjjp

jgwigjjp1#

您可以设置一个新的分组列na.grp,为Col2中的每个NA指定一个唯一的编号,并为那些非NA元素指定一个通用编号。

library(dplyr)

df %>%
  group_by(Col1, na.grp = ifelse(is.na(Col2), cumsum(is.na(Col2)), 0)) %>%
  summarise(Col2 = paste(Col2, collapse = ", "), .groups = "drop") %>%
  select(-na.grp)

# # A tibble: 5 × 2
#   Col1  Col2       
#   <chr> <chr>      
# 1 C64   NA         
# 2 C64   NA         
# 3 D19   Marquis    
# 4 D23   John, JohnY
# 5 F212  ALICE, BOB
数据
df <- read.table(text = "
Col1  Col2
F212  ALICE
D23   John
C64   NA
F212  BOB
C64   NA
D23   JohnY
D19   Marquis", header = TRUE)
wkftcu5l

wkftcu5l2#

使用reframe

library(dplyr)
df1 %>% 
  reframe(Col2 = if(all(is.na(Col2))) Col2 else toString(Col2[!is.na(Col2)])
      , .by = "Col1")
  • 输出
Col1        Col2
1 F212  ALICE, BOB
2  D23 John, JohnY
3  C64        <NA>
4  C64        <NA>
5  D19     Marquis

相关问题