当前位置: 首页 > 知识库问答 >
问题:

填充组中其他行的缺失值(包括重复项)

谢奕
2023-03-14

我有一个数据集,其中有一些缺失的值,我想用同一组的其他成员填充这些值。但是,在某些情况下,每个组有不止一个值,在这些情况下,我希望复制每个组中的所有行,以便有一行包含每个值。

样本数据:

   ID group value
1   1     A  blue
2   2     A  <NA>
3   3     A  <NA>
4   4     B green
5   4     B   red
6   5     B  <NA>
7   6     B  <NA>
8   7     C  blue
9   8     C green
10  9     C    NA

我最终想要的是:

  ID group value
1  1     A  blue
2  2     A  blue
3  3     A  blue
4  4     B green
5  4     B   red
6  5     B green
7  5     B   red
8  6     B green
9  6     B   red
10 7     C  blue
11 7     C green
12 8     C  blue
13 8     C green
14 9     C  blue
15 9     C green

在某些情况下,组包含一个具有两个值的ID(如组B),而在其他情况下,组中有一个以上的ID,每个ID都有不同的值(如C)。在任何情况下,我都想要一个表,其中组的每个成员都有该组中存在的每个值。我找到了一些处理简单情况的答案,如组A,但没有一个答案是每个组有一个以上的值。

====编辑====

我的实际数据集要大得多,这导致了一些额外的问题。更新的示例表如下:

ID group value specific_value dataversion
1     A  blue       sky_blue    version1
2     A  <NA>           <NA>    version2
3     A  <NA>           <NA>    version1
4     B green   forest_green    version1
4     B   red        scarlet    version1
5     B  <NA>           <NA>    version2
6     B  <NA>           <NA>        <NA>
7     C  blue     royal_blue    version2
8     C green     lime_green    version1
9     C  <NA>           <NA>    version1

对于每个组,我希望有一个行,其中包含该组中每个成员的每个值集specific_value(但我不希望有一行,例如。蓝色和lime_green)。我希望其他列(ID、组和数据版本)的所有值保持原样(包括如果例如数据版本是NA)。

预期输出:

ID group value specific_value dataversion
1     A  blue       sky_blue    version1
2     A  blue       sky_blue    version2
3     A  blue       sky_blue    version1
4     B green   forest_green    version1
4     B   red        scarlet    version1
5     B green   forest_green    version2
5     B   red        scarlet    version2
6     B green   forest_green        <NA>
6     B   red        scarlet        <NA>
7     C  blue     royal_blue    version2
7     C green     lime_green    version2
8     C  blue     royal_blue    version1
8     C green     lime_green    version1
9     C  blue     royal_blue    version1
9     C green     lime_green    version1

即。表中 ID、组和数据版本的每个组合都与原始表相同,但现在每个组的值和specific_value组合都有一行。请注意,在我的实际表中,我有 ~50 列数据(1 个分组列,~6 列相当于这里的值/特定值,其余的被视为 ID/数据版本),所以我不想输入每个列名称。

共有1个答案

毋琪
2023-03-14

我们可能需要< code>complete。按“组”分组后,使用< code>complete获取每个“组”和“ID”的< code>unique非NA“值”的组合

library(dplyr)
library(tidyr)
library(stringr)
df1 %>% 
   group_by(group) %>%
   complete(ID, value = unique(value[!is.na(value)])) %>%
   na.omit %>%
   select(names(df1))
# A tibble: 15 x 3
# Groups:   group [3]
#      ID group value
#   <int> <chr> <chr>
# 1     1 A     blue 
# 2     2 A     blue 
# 3     3 A     blue 
# 4     4 B     green
# 5     4 B     red  
# 6     5 B     green
# 7     5 B     red  
# 8     6 B     green
# 9     6 B     red  
#10     7 C     blue 
#11     7 C     green
#12     8 C     blue 
#13     8 C     green
#14     9 C     blue 
#15     9 C     green

有了新的数据集,我们可以

df2 %>%
   group_by(group) %>%
   mutate(valnew = str_c(value, specific_value, sep=":")) %>% 
   select(-value, -specific_value, -dataversion) %>%
   complete(ID, valnew = unique(valnew[!is.na(valnew)])) %>% 
   filter(!is.na(valnew)) %>% 
   separate(valnew, into = c('value', 'specific_value'), sep=":") %>% 
   mutate(rn = row_number()) %>%
   left_join(df2 %>% 
               select(ID, dataversion)) %>%
   filter(!duplicated(rn)) %>%
   select(names(df2))
# A tibble: 15 x 5
# Groups:   group [3]
#      ID group value specific_value dataversion
#   <int> <chr> <chr> <chr>          <chr>      
# 1     1 A     blue  sky_blue       version1   
# 2     2 A     blue  sky_blue       version2   
# 3     3 A     blue  sky_blue       version1   
# 4     4 B     green forest_green   version1   
# 5     4 B     red   scarlet        version1   
# 6     5 B     green forest_green   version2   
# 7     5 B     red   scarlet        version2   
# 8     6 B     green forest_green   <NA>       
# 9     6 B     red   scarlet        <NA>       
#10     7 C     blue  royal_blue     version2   
#11     7 C     green lime_green     version2   
#12     8 C     blue  royal_blue     version1   
#13     8 C     green lime_green     version1   
#14     9 C     blue  royal_blue     version1   
#15     9 C     green lime_green     version1   
df1 <- structure(list(ID = c(1L, 2L, 3L, 4L, 4L, 5L, 6L, 7L, 8L, 9L), 
    group = c("A", "A", "A", "B", "B", "B", "B", "C", "C", "C"
    ), value = c("blue", NA, NA, "green", "red", NA, NA, "blue", 
    "green", NA)), row.names = c("1", "2", "3", "4", "5", "6", 
"7", "8", "9", "10"), class = "data.frame")


df2 <- structure(list(ID = c(1L, 2L, 3L, 4L, 4L, 5L, 6L, 7L, 8L, 9L), 
    group = c("A", "A", "A", "B", "B", "B", "B", "C", "C", "C"
    ), value = c("blue", NA, NA, "green", "red", NA, NA, "blue", 
    "green", NA), specific_value = c("sky_blue", NA, NA, "forest_green", 
    "scarlet", NA, NA, "royal_blue", "lime_green", NA), dataversion = c("version1", 
    "version2", "version1", "version1", "version1", "version2", 
    NA, "version2", "version1", "version1")), class = "data.frame",
    row.names = c(NA, 
-10L))
 类似资料:
  • 我有以下数据帧(示例): 我想用每组前一天的值来填写缺失的日期。我可以使用这个答案中的代码,但问题是我可能在每个组中都有重复的条目(日期)。返回以下错误: 我想要的输出应如下所示: 一些日期解释说: A组缺少日期“2022-09-03”和“2022-09-05”。如您所见,这些值来自上一个日期 B组缺少日期“2022-09-02”、“2022-09-06”和“2022-009-09”。对于这些,它

  • 问题内容: 这应该很简单,但是我发现的最接近的内容是这篇文章: pandas:填充组中的缺失值,但我仍然无法解决我的问题。 假设我有以下数据框 我想在每个“名称”组中用平均值填写,即 我不确定要去哪里: 问题答案: 一种方法是使用:

  • 我有一个select,它给我带来了一些主键。我需要从上一个查询中未列出的其他表中选择所有值。我该怎么做? 我一直在尝试: 但不起作用,它还带来了子查询中的数据。我正在使用PostgreSQL。

  • 我有一个缺少“SNAP_ID”值的数据帧。我想根据前一个非缺失值(lag()?)的序列,用浮点值填充缺失值。如果可能的话,我真的想只用dplyr来实现这一点。 假设: 永远不会有丢失的数据,因为第一行或最后一行我根据数据集的最小值和最大值之间的缺失天数生成缺失的日期 数据集中可能存在多个空白 当前数据: 我想要实现的目标: 作为数据帧: 这是我实现这个目标的尝试,但它只适用于第一个缺失的值: 来自

  • 欢迎提供任何关于这个问题更准确标题的帮助。。 我有一个数据框,其中包含客户级别的观察结果,记录日期以及客户在该日期消费的物品。看起来像这样。 此数据集中的每个观察值都与一个独特的存储日组合有关,但每个存储日观察值都是以消耗的物品的正数为条件列出的,即

  • 我喜欢用基于其他列的Formel填充列中的空值: 你能看出我的代码有什么问题吗?因为这段代码后面有一些nulll值。 我的数据框: Datadate|datacqtr 2002-02-28|2002Q1 Dataacqtr代表四分之一。有时我有datadate,但没有datacqtr(四分之一)。所以我喜欢填充基于colmn数据的colmn datacqtr。