如果满足另一列中的条件,则将数据从一列复制到另一列

2024-01-01

我正在尝试创建一个标题为 Study_id、Conflict 的表,并创建第三列和第四列,其中包含与列中的值相对应的数据: Conflict

下面的代码实现了这个目的。然而它相当长,特别是因为我希望将其扩展以涵盖列中的数百个不同值:冲突

预先感谢您的任何指点

df <- data.frame(study_id=c("1", "1", "4", "4", "5"), 
                 Conflict=c("WATER.START", "WATER.STOP", "OIL.START", "NA", "WATER.STOP"), 
                 Result=c("TRUE", "TRUE", "TRUE", "NA", "TRUE"))

df2 <- data.frame(study_id=c("1", "2", "3", "4", "5"), 
                  WATER.start=c(1, 1, 2, NA, 6), 
                  WATER.truestart=c(1, 1, 2, NA, 25), 
                  WATER.stop=c(33, 3, 2, NA, 8), 
                  WATER.truestop= c(34, 4, 2, NA, 8))

final <- left_join(df, df2, by ='study_id')

dd <- final %>% filter(Result == "TRUE" & Conflict == "WATER.START")
dd <- dd %>% subset(., Conflict == "WATER.START", 
                    select=c(study_id, Conflict, WATER.start, WATER.truestart))
dd <- dd %>% rename(initial=WATER.start) %>% rename(verification=WATER.truestart)

ee <- final %>% filter(Result == "TRUE" & Conflict == "WATER.STOP")
ee <- ee %>% subset(., Conflict == "WATER.STOP", 
                    select=c(study_id, Conflict, WATER.stop, WATER.truestop))
ee <- ee %>% rename(initial=WATER.stop) %>% rename(verification=WATER.truestop)

ff <- bind_rows(dd, ee)
gg <- ff %>% select(study_id, Conflict, initial, verification)

gg 
#   study_id    Conflict initial verification
# 1        1 WATER.START       1            1
# 2        1  WATER.STOP      33           34
# 3        5  WATER.STOP       8            8

首先,因为看起来你只关注c('WATER.START', 'WATER.STOP'), subset你的第一个df。接下来,对于每一个MARGIN=1(即每一行),我们apply匿名函数\(x)选择适当的列df2, using tolower匹配大小写,并且cbind在一起。最后使用重命名列setNames and rbind结果列表。

subset(df, Conflict %in% c('WATER.START', 'WATER.STOP')) |>
  apply(MARGIN=1, \(x) {
    mt <- match(tolower(x[2]), tolower(names(df2)))
    cbind(t(x[1:2]), df2[df2$study_id == x[1], c(mt, mt + 1)]) |>
    setNames(c('study_id', 'Conflict', 'initial', 'verification'))
}) |> do.call(what=rbind)
#   study_id    Conflict initial verification
# 1        1 WATER.START       1            1
# 2        1  WATER.STOP      33           34
# 5        5  WATER.STOP       8            8

你也可以使用字典a(这可能会扩展到您可能正在使用的其他级别)。

a <- c(WATER.START='WATER.start', WATER.STOP='WATER.stop')

subset(df, Conflict %in% c('WATER.START', 'WATER.STOP')) |>
  apply(MARGIN=1, \(x) {
    mt <- match(a[match(x[2], names(a))], names(df2))
    cbind(t(x[1:2]), df2[df2$study_id == x[1], c(mt, mt + 1)]) |>
      setNames(c('study_id', 'Conflict', 'initial', 'verification'))
  }) |> do.call(what=rbind)
#   study_id    Conflict initial verification
# 1        1 WATER.START       1            1
# 2        1  WATER.STOP      33           34
# 5        5  WATER.STOP       8            8

However,我认为你真正需要的是reshape您的数据。

## basic
reshape(df2, direction='long', idvar=1, varying=list(c(2, 4), c(3, 5))) 
#     study_id time WATER.start WATER.truestart
# 1.1        1    1           1               1
# 2.1        2    1           1               1
# 3.1        3    1           2               2
# 4.1        4    1          NA              NA
# 5.1        5    1           6              25
# 1.2        1    2          33              34
# 2.2        2    2           3               4
# 3.2        3    2           2               2
# 4.2        4    2          NA              NA
# 5.2        5    2           8               8

## enhanced
reshape(df2, dir='long', idvar='study_id',
        varying=list(c("WATER.start", "WATER.stop"), c("WATER.truestart", "WATER.truestop")),
        timevar='foo', times=c('water.start', 'water.stop'), v.names=c('initial', 'verification')) 
#               study_id         foo initial verification
# 1.water.start        1 water.start       1            1
# 2.water.start        2 water.start       1            1
# 3.water.start        3 water.start       2            2
# 4.water.start        4 water.start      NA           NA
# 5.water.start        5 water.start       6           25
# 1.water.stop         1  water.stop      33           34
# 2.water.stop         2  water.stop       3            4
# 3.water.stop         3  water.stop       2            2
# 4.water.stop         4  water.stop      NA           NA
# 5.water.stop         5  water.stop       8            8
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果满足另一列中的条件,则将数据从一列复制到另一列 的相关文章

随机推荐

  • 选择要安装的包 - 安装按钮呈灰色

    我正在尝试使用 sdk 管理器安装一组软件包 但即使选择 全部接受 后 安装 按钮仍然呈灰色 我可以看到一些文字说 这个包依赖于 缺少 SDK 平台 Android API 17 但不知道我需要做什么来安装 缺少 SDK 平台 Androi
  • 何时应在函数返回值上使用 std::move? [复制]

    这个问题在这里已经有答案了 在这种情况下 struct Foo Foo meh return std move Foo 我很确定此举是不必要的 因为新创建的Foo将是一个 x 值 但在这样的情况下该怎么办呢 struct Foo Foo m
  • Guice 最佳实践和反模式

    我不确定这个问题是否有价值 但是是否有任何特定于的最佳实践和反模式谷歌指南 https github com google guice 请将任何通用 DI 模式定向至这个问题 https stackoverflow com q 168255
  • Javascript - XMLHttpRequest 如何同时发送多个请求?

    我遇到了一个非常超自然的问题 我正在尝试实现一个购物车 其中我在客户端存储了 cookie 以识别已订购的商品 ID 及其数量 当我加载结帐 HTML 页面时 我会读取 cookie 并逐个获取项目 id 然后 对于每个项目 id 我将向我
  • 如何注册网络 python 包安装的入口点?

    我有一个用户环境 其中大多数 python 软件包都安装在网络共享上 并可通过PYTHONPATH环境变量 Python本身仍然安装在本地 其中一些软件包需要注册 setuptools切入点 http pythonhosted org se
  • git 子模块分支是否与主项目的分支一起切换?

    最近我开始了解 git 子模块 它们似乎是自给自足的项目 拥有自己的 git 结构和分支 当我切换主项目的分支时 这是否也会切换子模块的分支 git 如何处理这种情况 我最近遇到类似的问题 https stackoverflow com a
  • 使用 Javascript 关闭 iPhone 视频播放器

    我有一个带有多个 html5 标签的网页 为用户提供了许多他们可以选择播放的视频的海报 缩略图 当用户触摸其中一个时 iPhone 视频播放器就会打开并播放视频 我希望能够在视频播放完毕后自动关闭视频播放器并将用户返回到缩略图 我已经为 结
  • 为什么使用 Url.Content 来引用资源?

    在我遇到的几乎每个 ASP NET MVC 示例中 我总是看到网址内容用于引用 CSS JavaScript 和图像 没有人解释过为什么要使用它 有谁愿意解释一下吗 这样做有什么不好 img src Content Img MyImage
  • 无法将 iOS 自定义框架添加到 KMM(Kotlin 多平台)模块(未找到 cinteropXXXIosArm64 FAILED 模块)

    我正在开发一个 iOS 应用程序 它使用 Kotlin Native 共享模块 这个Kotlin Native共享模块 利用了自主开发的iOS框架 这在过去非常有效 但现在我正在尝试将我的项目升级为最新版本的 Kotlin Native 此
  • React,webpack:避免导入语句中的“..”

    我目前正在学习 React 因此正在学习 es6 es7 和 webpack 来自主要Python背景的我对导入语句的文件夹敏感路径声明感到恼火 即使用 在进口声明中 这意味着如果我将文件移动到不同的目录 我需要更改文件中声明的导入语句 P
  • c 开关和跳转表

    据我了解 c c 中的 switch 语句有时会编译为跳转表 我的问题是 有什么经验法则可以保证这一点吗 就我而言 我正在做这样的事情 enum myenum MY CASE0 0 MY CASE0 1 switch foo case MY
  • jQuery 获取特定选项标签文本

    好吧 假设我有这个
  • 在 Firebase 中对类似聊天的应用程序进行建模

    我有一个 Firebase 数据库结构问题 我的场景接近于聊天应用程序 以下是具体细节 users node storing several users of the app id1 name John id2 name Meg id2 n
  • Java ZonedDateTime 到 Instant 转换

    我计划按照以下逻辑将 ZonedDateTime 转换为即时时间 假设我处于 PST 时区 当前时间是上午 11 点 如果我现在转换 从今天 2018 年 3 月 4 日起没有夏令时 toInstant 将为晚上 7 点 由于遵守夏令时 自
  • 如何使用多处理实现发布/订阅模式?

    有什么办法可以使用发布 订阅模式multiprocessing数据结构 换句话说 我想要类似队列的东西 只不过发布者可以同时向多个工作人员发送单个命令 您可以创建自己的数据结构 以使用包装器来实现简单的发布 订阅模式multiprocess
  • 用于在大写字母前添加下划线的正则表达式

    如何在字符串中的大写字母前添加下划线 第一个字母除外 1 VarLengthMean VarWidthMean 我希望它变成 1 Var Length Mean Var Width Mean 我考虑过使用str replace all fr
  • 如何使用Java通过Selenium WebDriver按Ctrl+A选择页面中的所有内容

    I want to select all content by pressing Ctrl a from keyboard by using WebDriver with Java I wrote the following code Ac
  • django中基于表单输入和字符串操作的查询

    Django 表单中的字段 https stackoverflow com questions 50841850 django fields in form 50845891 50845891 正如问题 4 中所述 我需要获取表单输入并计算
  • 解决使用 OOP 时的过程混乱

    我正在用 Fortran 语言编写向量类型 但我感到非常困惑 假设我有以下派生类型 Type Vector Real x y Contains Procedure vector smul End Type Function vector s
  • 如果满足另一列中的条件,则将数据从一列复制到另一列

    我正在尝试创建一个标题为 Study id Conflict 的表 并创建第三列和第四列 其中包含与列中的值相对应的数据 Conflict 下面的代码实现了这个目的 然而它相当长 特别是因为我希望将其扩展以涵盖列中的数百个不同值 冲突 预先