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

创建一个新变量,该变量仅在R中满足条件时打印一系列列中的第一个值

百里秋月
2023-03-14

我正在尝试创建一个新变量,该变量仅在满足特定条件时才打印一系列列的第一个值。

为了澄清,我的数据库看起来像这样:

我想创建一个变量(main),仅当值不是以C00到C99开头时,才打印第一个var列中的值。如果值确实以该条件开头,那么我想在下一列测试该条件,直到满足条件并打印该值。

因此,对于上表,新创建的变量(main)应如下所示:

我不太确定从哪里开始,但我怀疑这可能涉及突变()和ifelse()

共有2个答案

郭志泽
2023-03-14

这将创建一个列,其中存储了所有不满足条件的值:来自akrun的数据:

library(tidyverse)

df1 %>% 
  mutate(across(var1:var4, ~case_when(str_detect(., "^C\\d+") ~ "",
                                      TRUE ~ .), .names = 'new_{col}')) %>%
  unite(New_Col, starts_with('new'), na.rm = TRUE, sep = ' ')
    var1    var2  var3  var4           New_Col
1   C7931   C3490 R0781   I10         R0781 I10
2    R079   R0600   I10 C3490   R079 R0600 I10 
3 S270XXA S225XXA C3490 C7931 S270XXA S225XXA  
张浩阔
2023-03-14

我们可以使用grepl通过在每一行上循环来创建用于子集的逻辑向量。匹配的模式C,后跟一个或多个数字(\\d),对逻辑向量求反(

df1$main <- apply(df1[startsWith(names(df1), "var")], 1, 
       function(x) x[!grepl("^C\\d+", x)][1])

整洁,可以使用str_subset

library(dplyr)
library(stringr)
df1 %>% 
 rowwise %>% 
 mutate(main = first(str_subset(c_across(starts_with("var")), 
       regex("^C\\d+"), negate = TRUE))) %>%
 ungroup
# A tibble: 3 × 5
  var1    var2    var3  var4  main   
  <chr>   <chr>   <chr> <chr> <chr>  
1 C7931   C3490   R0781 I10   R0781  
2 R079    R0600   I10   C3490 R079   
3 S270XXA S225XXA C3490 C7931 S270XXA
df1 <- structure(list(var1 = c("C7931", "R079", "S270XXA"), var2 = c("C3490", 
"R0600", "S225XXA"), var3 = c("R0781", "I10", "C3490"), var4 = c("I10", 
"C3490", "C7931")), class = "data.frame", row.names = c(NA, -3L
))

 类似资料:
  • 我需要帮助完成一项看似简单的任务。我想基于< code>dplyr::mutate中的一个条件创建几个新变量。我可以使用< code>ifelse创建一个新变量,但是我想一步创建几个。 让我们假设这是我的数据帧。 我想要这样的东西: 因此,if条件应该基于条件< code>y创建三个新变量 我想与< code>if_else和< code>case_when一起使用。 谢谢转发

  • 嗨,我想通过使用mutate函数来创建一个新变量Foldchange。但是我想使用来自同一列的值来计算这个值。有没有什么方法可以计算一个新变量,从同一列中折叠更改,而无需重新排列表格,这样表格就不需要拆分了? 下面是一个清晰的例子: 我想要的输出类似于使用: 获取 显然,我不能使用此代码基于V1和V2变量进行选择,但这只是为了说明。我希望通过这种方式,我可以保持我的附加表的完整性,折叠更改将具有重

  • 可能重复: Java中的动态变量名: 假设我有一个字符串,如下所示。 现在,我想创建一个字符串,但是字符串的变量将被称为“Hello”。为了使字符串名为“Hello”,我必须访问string以获取名称“Hello”,这样我就可以将其用作变量名。下面是我想看的。 感谢您的努力,请尝试向我解释,因为我是Java初学者D

  • 我是R的新手,这是我关于堆栈溢出的第一个问题。 我正在努力 要通过引用指定新列,请执行以下操作: 对于每行 使用同一行组中第一行到下一行的值。 这符合一个条件 示例数据: 我想做的是 子集(组)按 对于每行 查找进一步向下的第一行的, 其中,和(找到的行)大于我正在更新的行的 我的预期结果是: 我使用<code>尝试了许多变体。SD,,创建一个新的列,其中包含但实际上没有得到任何结果。非常感谢任何

  • 我有这个数据 如果M3大于UCL,MM3将为“UP”,否则为“NULL” 但是我有几个M列(比如m1~m1005),所以我想做一些代码,比如mutate_each和mutate_at。如何使用mutate和ifelse函数在特定条件下创建新列?