r - 根据数据框中的条件向值添加字符/字母
问题描述
我有一个 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
,但我仍然坚持。寻找一个有效且有效的解决方案,以便我可以学习“理想的编码原则”。提前致谢。
解决方案
我们可以根据 的出现创建一个逻辑索引_
。取反 ( !
),将“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))
推荐阅读
- reactjs - React 中动态表的渲染模式
- python-3.x - 在python中以某种语言导入字母表的所有字母
- vim - 如何在 Vi 编辑器中从多个页面复制文本
- kubernetes - 服务不可用 - 尝试在 Kubernetes 的 Hyperledger 结构设置中创建通道时没有 raft 领导者
- javascript - 使用应用程序在生产和测试 API 之间切换
- asp.net - 带有 Html.TextBoxFor 的 KeyUp 事件
- assembly - stosd 在装配中是如何工作的?
- git-bash - 在 Gitbash 中向后退一步/Dir
- java - 从现有的 Spring Boot 服务中提取公共代码并使用 maven 和 git 子模块重用代码
- c++ - cout 未在此范围内声明