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

跨列使用case_when创建新列

杜志
2023-03-14

我有一个很大的数据集,其中有许多带有状态的列。我想做一个新的专栏,有参与者的当前状态。我试图在dplyr中使用case_when,但我不确定如何跨列。数据集的列太多,我无法键入每一列。以下是数据示例:

library(dplyr)
problem <- tibble(name = c("sally", "jane", "austin", "mike"),
                  status1 = c("registered", "completed", "registered", "no action"),
                  status2 = c("completed", "completed", "registered", "no action"),
                  status3 = c("completed", "completed", "withdrawn", "no action"),
                  status4 = c("withdrawn", "completed", "no action", "registered"))

对于代码,我想要一个新的列,列中说明参与者的最终状态;然而,如果他们的状态曾经是完成的,那么我希望它说完成,不管他们的最终状态是什么。对于该数据,答案如下所示:


answer <- tibble(name = c("sally", "jane", "austin", "mike"),
                 status1 = c("registered", "completed", "registered", "no action"),
                 status2 = c("completed", "completed", "registered", "no action"),
                 status3 = c("completed", "completed", "withdrawn", "no action"),
                 status4 = c("withdrawn", "completed", "no action", "registered"),
                 finalstatus = c("completed", "completed", "no action", "registered"))

还有,如果你能包括对你的代码的任何解释,我会非常感激的!如果您的解决方案还可以使用contains(“status”),这将特别有用,因为在我的真实数据集中,status列非常混乱(例如summary_status_5292019,sum_status_07012018等)。

共有1个答案

曾新
2023-03-14

带有pmap的选项

library(tidyverse)
problem %>%
     mutate(finalstatus =  pmap_chr(select(., starts_with('status')), ~ 
       case_when(any(c(...) == "completed")~ "completed",
             any(c(...) == "withdrawn") ~ "no action", 
     TRUE ~ "registered")))
 类似资料:
  • 简单地说,我需要将一系列列中的值与一个“基线”列进行比较。当列中的值高于基线时,我需要使用基线值。当列中的值低于或等于基线时,我需要保留该值。下面是一个示例数据集(我的实际数据集要大得多): 我当前的代码使用mutate_at()并且运行良好: 但是当我试图更新它以反映DPLYR1.0中的跨()时,我总是得到一个错误。以下是我的尝试: 你知道我做错了什么吗?case_when()是否适用于交叉?

  • 我有这样的调查数据。唯一的回答是“na”或“yes”。 我不得不对数据应用以下逻辑: null null 任何建议都非常感谢!我想我可能得用一个循环,但我不知道怎么用。如果我转换为数值并将所有4列求和,我可以使用类似…?

  • 我有一个国家和年份级别的面板数据集,我想根据现有的变量创建两个新变量。 我想做的是创建两个新变量集:(1)每年(跨国家)平均值的变量集和(2)国家/地区值相对于年平均值的变量集。例如,对于 var1(1) 将产生 mean_var1 和 (2) relmean_var1我希望这些变量用于所有其他变量。总的来说,数据集中有超过1000个变量,但我只将此函数应用于大约6个。 我有适用于第一部分的代码,

  • 我在 RabbitMQ 中创建新队列时遇到了一些问题。我只创建一个使用者客户端,该客户端将使用来自另一个微服务的消息。 这是我到目前为止所做的。 应用程序属性: 配置类: 和侦听器类: 当我运行这个程序时,我有一条ACCESS_REFUSED消息,但我不知道为什么。我错过了什么吗?? 谢谢

  • 问题内容: 我想在不使用旧版SQL的情况下向现有表中添加一列。 基本的SQL语法是: 我格式化了Google BigQuery的查询: 但是,此错误的语法不正确: 那么,如何正确设置Google BigQuery的SQL格式? 问题答案: BigQuery不支持或其他DDL语句,但是您可以考虑提交功能请求。现在,您需要在BigQuery UI中的表中打开,然后使用“添加新字段”按钮添加该列,或者,

  • 现在,我想在一个函数中使用这个,如下所示- 然后使用此函数在我的DataFrame中创建一个新列 总之,我希望我的列“new_col”是一个类型数组,其值为[[x,x,x]] 我得到以下错误。我在这里做错了什么? 原因:java.lang.UnsupportedOperationException:不支持org.apache.spark.sql.Column类型的模式