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

2024-02-11

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

样本数据:

   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,该 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

对于每个组,我希望为该组的每个成员保留一行,其中包含该组的每组值+特定值(但我不希望包含例如蓝色和石灰绿的行)。我希望其他列(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

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


我们可能需要complete这里。按“组”分组后,使用complete得到的组合unique每个“组”和“ID”的非 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

Update

使用新数据集,我们可以做

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   

data

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))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 确保 C++ 中的 OpenGL 兼容类型

    OpenGL 缓冲区对象支持各种明确定义宽度的数据类型 GL FLOAT是32位的 GL HALF FLOAT是16位的 GL INT是 32 位 如何确保 OpenGL 的跨平台和面向未来的类型 例如 喂食float数据从 C 数组到缓冲
  • .NET 中通过 Process.Start 生成的进程会挂起线程

    我们的应用程序有一个后台线程 它通过以下方式生成一个进程System Diagnostics Process Process Start new ProcessStartInfo FileName url UseShellExecute t
  • Java 运行时 ClassNotFoundException

    只是有一个关于我遇到的奇怪的运行时错误的问题 我正在使用一个 JSON 服务器 当外部源提示时 该服务器会响应 JSON 对象 然而 到目前为止 我只是尝试在发送 JSON 对象之前启动并运行它 我的代码编译时没有指定任何类路径 但是当涉及
  • Java 8 forEach 带索引[重复]

    这个问题在这里已经有答案了 有没有办法建立一个forEachJava 8 中使用索引迭代的方法 理想情况下我想要这样的东西 params forEach idx e gt query bind idx e 我现在能做的最好的事情就是 int
  • MySQL 5.7 无法匹配两个汉字

    表TB title keywords 企业贷款 该如何看懂银行流水 出口退税 贷款 现金流量表 利润表 最高人民法院关于审理民间 企业贷款 合同法 贷款 中国宏观经济数据点评 企业贷款 贷款 ngram token size 2 FULLT
  • iOS Swift didBeginContact 没有被调用

    这两天我一直在努力让两个SKSpriteNode注册碰撞并唤起didBegin contact 我已经设置了他们的位掩码 categoryBitMask contactTestBitMask and collisionTestBitMask
  • 在子文件夹中运行的 Angular 7 中的路由无法正常工作

    我们正在努力将我们的应用程序迁移到新的 Angular 版本 旧的 Angular JS 是它自己的应用程序 存储库 由 NET Framework 4 5 2 ASP NET MVC 应用程序提供服务 该应用程序会将每个调用路由到Home
  • Python:我尝试使用 tabula:ModuleNotFoundError:没有名为“tabula”的模块

    我尝试使用 python 模块 tabula 但显然我已经安装失败了 我只是使用了代码 import tabula 但是 我收到以下错误消息 ModuleNotFoundError No module named tabula 有什么想法吗
  • 带有 ExtJS 4 存储的 HTTP 标头

    我已经实例化了几家商店 但在某个时刻 我会在所有这些中添加一个 HTTP 标头 我怎样才能用 ExtJS 4 做到这一点 假设您使用的是 ajax 代理 您可以更新headers http docs sencha com ext js 4
  • (使用 SSH 运行命令时出错)命令行:第 0 行:配置选项错误

    错误消息 命令行 第 0 行 错误的配置选项 sh ssh i rundeck rsa key o StrictHostKeyChecking no o email protected cdn cgi l email protection
  • window.onbeforeunload - 在 Angular2 中导入

    我正在尝试使用window onbeforeunload在我的项目中 但我不知道如何使用它 我尝试过两种方式 1st way window on beforeunload function e return Are you sure you
  • 重定向到屏幕和管道

    我想将一些输出传输到另一个程序并显示进度条 代码看起来像这样 echo Progress for i in 1 10 do echo i echo gt screen sleep 1 done xargs echo where screen
  • 如何使用 pip 进行 pyenv?

    我在 Mac 上安装了 pyenv 来管理不同的 python 版本 之前 我有系统默认的 python 2 7 位于 Library Frameworks Python framework Versions 2 7 我还有 python3
  • SW2 更新后如何修复索尼 SmartWatch 2 上的自定义表盘时间 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 背景 索尼于 2014 年 12 月发布了索尼 SmartWatch 2 的更新 虽然更新为手表添加了新功能 但不幸的是 它导致了自定义表盘
  • Proguard 使 Android 应用程序中的 R 类反射不再起作用

    自从我尝试在 Google Play 上发布它以来 我已经在我的项目中激活了 proguard 尽管 proguard android txt 有 keepclassmembers class R public static
  • 这个错误在nhibernate中意味着什么

    出乎意料的是 我在使用 nhibernate 进行大量更新时遇到了此错误 行已被另一个事务更新或删除 或未保存值映射不正确 MyDomainObject 错误中没有附加信息 是否有一些推荐的方法来帮助识别根本问题 或者有人可以给我一个更好的
  • 使用 FFMPEG 的 PHP HTML5 兼容 MP4 视频

    您好 我正在使用 FFMPEG 用 PHP 转换上传的视频 echo conversion exercise started br br looping through all files in the directory if handl
  • 循环访问使用 xalan:nodeset 获取的节点集时,xsl:key 不起作用

    我发现 xsl key 似乎不起作用的情况 我正在将 XSLT 1 与 Xalan 已编译 一起使用 这就是发生的情况 1 这有效 密钥名为test1工作正常
  • Django 在模板之外人性化?

    我知道我可以使用 humanize 模块将日期 时间转换为 django 模板中更友好的格式 我想知道是否可以在模板之外转换这些内容 例如在一个views py函数或models py类 意思是在 django 模板之外 还有其他库可以做到
  • 填充组中其他行的缺失值(包括重复项)

    我有一个数据集 其中有一些缺失值 我想用同一组的其他成员来填充这些值 但是 在某些情况下 每组有多个值 在这些情况下 我希望复制每组中的所有行 以形成包含每个值的一行 样本数据 ID group value 1 1 A blue 2 2 A