我试图创建一个新变量,仅当满足特定条件时,才打印一系列列的第一个值.

为了澄清,我的数据库如下所示:

var1 var2 var3 var4
C7931 C3490 R0781 I10
R079 R0600 I10 C3490
S270XXA S225XXA C3490 C7931

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

因此,对于上表,新创建的变量(main)应该是这样的:

var1 var2 var3 var4 main
C7931 C3490 R0781 I10 R0781
R079 R0600 I10 C3490 R079
C0258 S225XXA C3490 C7931 S225XXA

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

推荐答案

我们可以使用grepl通过在每一行上循环来创建一个用于子集设置的逻辑向量.匹配的模式是C后跟一个或多个数字(\\d+)并对逻辑向量求反(!)以将元素子集,然后返回第一个([1])

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

对于tidyverse,可以使用rowwisestr_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 = "数据.frame", row.names = c(NA, -3L
))

R相关问答推荐

大规模重新标记haven标签数据

如何在编辑列时更新可编辑数据表,并使用该表在Shiny中执行连续计算

如何将旋转后的NetCDF转换回正常的纬度/经度网格,并使用R?

将包含卷的底部25%的组拆分为2行

如何得到每四个元素向量R?

打印XTS对象

解析R函数中的变量时出现的问题

无法定义沿边轨迹的 colored颜色 渐变(与值无关)

在多页PDF中以特定布局排列的绘图列表不起作用

'使用`purrr::pwalk`从嵌套的嵌套框架中的列表列保存ggplots时出现未使用的参数错误

数据集上的R循环和存储模型系数

注释不会绘制在所有ggplot2面上

基于R中的引用将向量值替换为数据框列的值

策略表单连接两个非常大的箭头数据集,而不会 destruct 内存使用

从矩阵创建系数图

修复标签重叠和ggploy内的空间

如何使用ggsurvfit包更改风险表中的标签名称?

R代码来迭代列表,将它们组合成一个带有分组变量的数据框?

将矩阵中特定行的双精度值添加到下一行中

动态分组和计算分组依据