R 如何将重复的行与缺少的字段合并

R 如何将重复的行与缺少的字段合并,r,dplyr,R,Dplyr,我有一个包含多个重复条目的数据集,条目基本相同,但如果缺少数据,则缺少的数据可能位于除ID之外的任何字段中。例如: A tibble: 5 x 4 ID name age fsm <chr> <chr> <dbl> <dbl> 1 0001 Peter 13 NA 2 0001 NA 13 1 3 0002 Jane 13 1 4 0002 Jane NA

我有一个包含多个重复条目的数据集,条目基本相同,但如果缺少数据,则缺少的数据可能位于除ID之外的任何字段中。例如:

 A tibble: 5 x 4
 ID    name    age   fsm
  <chr> <chr> <dbl> <dbl>
1 0001  Peter    13     NA
2 0001  NA       13     1
3 0002  Jane     13     1
4 0002  Jane     NA     1
5 0003  Billy    12     0
已更新 特别感谢亲爱的@akrun,他毫不犹豫地为我们的解决方案提供见解,并与我们分享他的知识和经验

我希望这就是你想要的:

library(dplyr)

df %>%
  group_by(ID) %>%
  summarise(across(everything(), ~ first(na.omit(.x))))

# A tibble: 3 x 4
  ID    name    age   fsm
  <chr> <chr> <dbl> <dbl>
1 0001  Peter    13     1
2 0002  Jane     13     1
3 0003  Billy    12     0

库(dplyr)
df%>%
分组依据(ID)%>%
总结(跨越(everything(),~first(na.omit(.x)))
#一个tibble:3x4
身份证姓名年龄
0001彼得13 1
20002简13 1
3003比利120
这个解决方案也有效。这听起来可能有点冗长,但在这种情况下非常有用和方便:

library(dplyr)
library(tidyr)
library(purrr)

df %>%
  nest(data = -c(ID)) %>%
  mutate(data = map(data, ~ map_dfc(., na.omit))) %>%     # We use one map function inside the other since one will iterate elements of the nested list and the other iterate over the elements of the underlying tibbles
  unnest(cols = c(data)) %>%
  group_by(ID) %>%
  summarise(across(everything(), first))

# A tibble: 3 x 4
  ID    name    age   fsm
  <chr> <chr> <dbl> <dbl>
1 0001  Peter    13     1
2 0002  Jane     13     1
3 0003  Billy    12     0

库(dplyr)
图书馆(tidyr)
图书馆(purrr)
df%>%
嵌套(数据=-c(ID))%>%
mutate(data=map(data,~map_dfc(,na.omit))%>%#我们在另一个映射函数中使用一个映射函数,因为其中一个将迭代嵌套列表的元素,而另一个将迭代底层文件的元素
unnest(cols=c(数据))%>%
分组依据(ID)%>%
总结(跨越(所有内容(),第一个))
#一个tibble:3x4
身份证姓名年龄
0001彼得13 1
20002简13 1
3003比利120

一个
数据表
选项

> setDT(df)[, lapply(.SD, function(...) fcoalesce(as.list(...))), ID]
     ID  name age fsm
1: 0001 Peter  13   1
2: 0002  Jane  13   1
3: 0003 Billy  12   0


在这里,当我只对分组数据应用
na.ommit
,而不选择第一行时,我意识到它产生了令人惊讶的效果。它没有删除带有
NA
值的行,而是使用同一组的相应值来完成它们。谢谢@Anoushiraven我离开R大约两年了,非常高兴第一次见到Cross命令。我很高兴。很高兴我能帮忙。是的,这要归功于跨越的一系列其他功能,如汇总所有,
汇总(如果
等)已被取代。这是因为可能存在重复的非NA元素。使用
first
换行只获取第一个非NA元素(如果其他值相同,则可以),summary可以为每个组返回多行。因此,如果首先删除
,对于ID 001,name和fsm有一个非NA元素,而age有两个。这意味着一个非NA元素可以循环使用以匹配max列的长度,或者您必须将其包装在一个长度不同的
列表中(data.frame/tible需要每个列的长度相同)
library(dplyr)
library(tidyr)
library(purrr)

df %>%
  nest(data = -c(ID)) %>%
  mutate(data = map(data, ~ map_dfc(., na.omit))) %>%     # We use one map function inside the other since one will iterate elements of the nested list and the other iterate over the elements of the underlying tibbles
  unnest(cols = c(data)) %>%
  group_by(ID) %>%
  summarise(across(everything(), first))

# A tibble: 3 x 4
  ID    name    age   fsm
  <chr> <chr> <dbl> <dbl>
1 0001  Peter    13     1
2 0002  Jane     13     1
3 0003  Billy    12     0

> setDT(df)[, lapply(.SD, function(...) fcoalesce(as.list(...))), ID]
     ID  name age fsm
1: 0001 Peter  13   1
2: 0002  Jane  13   1
3: 0003 Billy  12   0
> type.convert(setDT(df)[, as.list(do.call(fcoalesce, asplit(.SD, 1))), ID], as.is = TRUE)
   ID  name age fsm
1:  1 Peter  13   1
2:  2  Jane  13   1
3:  3 Billy  12   0