首页 > 解决方案 > 根据数据框中的条件向值添加字符/字母

问题描述

我有一个 ID 号数据框,我希望根据特定条件添加一个后缀。

ID

+----------+
|    ID    |
+----------+
| 130239   |
| 130241   |
| 130244   |
| 130250_2 |
| 130313_2 |
| 130248_2 |
| 130308_3 |
+----------+

本质上,如果_ID 号中没有,我想添加后缀_1,以表示样本 1。如果_存在,那么我不希望采取任何行动。

我尝试在一个循环中编写一个结合了 grepl 参数的 if-else 语句,以便我可以将 if-else 语句分别应用于每个 ID:

for (value in ID){
  if(grepl('_', value)){
    paste0(value, collapse=NULL)
  }else {
    paste(value, sep = "_1", collapse=NULL)
  }
}

我收到以下警告:

Warning message:
In if (grepl("_", value)) { :
  the condition has length > 1 and only the first element will be used

基本上我希望我的最终输出数据框看起来像这样:

+----------+
|    ID    |
+----------+
| 130239_1 |
| 130241_1 |
| 130244_1 |
| 130250_2 |
| 130313_2 |
| 130248_2 |
| 130308_3 |
+----------+

我怀疑我不能grepl像这里一样使用。我尝试阅读有关使用 dplyer 的类似解决方案mutate,但我仍然坚持。寻找一个有效且有效的解决方案,以便我可以学习“理想的编码原则”。提前致谢。

标签: rdataframe

解决方案


我们可以根据 的出现创建一个逻辑索引_。取反 ( !),将“ID”列及其paste后缀作为子集_1,并将值分配回该列

i1 <- !grepl("_", df1$ID)
df1$ID[i1] <- paste0(df1$ID[i1], "_1")
df1
#        ID
#1 130239_1
#2 130241_1
#3 130244_1
#4 130250_2
#5 130313_2
#6 130248_2
#7 130308_3

使用grepl,我们只修改列的一部分。在处理大数据集时特别有用


警告是 OP 的代码基于if/else未矢量化的使用。为此我们可以使用ifelse

数据

df1 <- structure(list(ID = c("130239", "130241", "130244", "130250_2", 
 "130313_2", "130248_2", "130308_3")), class = "data.frame", 
  row.names = c(NA, -7L))

推荐阅读