r - 如何为特定范围创建和插入包含分类变量的列
问题描述
我有一个包含一千多行样本名称很长的数据框,因此想添加一个分类索引。
例如对于这个数据框:
sample ...
Br_LV_0040324_BC1_1 ...
Br_LV_0040324_BC1_2 ...
Br_LV_0040324_BC1_3 ...
Br_LV_0040324_BC1_4 ...
Br_LV_0040324_LBR_1 ...
Br_LV_0040324_LBR_2 ...
添加一个分类索引,使其看起来像:
Index sample ...
BC1 Br_LV_0040324_BC1_1 ...
BC1 Br_LV_0040324_BC1_2 ...
BC1 Br_LV_0040324_BC1_3 ...
LBR Br_LV_0040324_LBR_4 ...
LBR Br_LV_0040324_LBR_1 ...
LBR Br_LV_0040324_LBR_2 ...
我最终通过眼睛计算了组的数量,并认为我可以创建一个与我的数据具有相同级别数量的数据框,然后手动按范围分配标签。所以我尝试了
s1 <- sample(0:1, 1022, replace = TRUE)
Index <- as.data.frame(s1, labels = "yes")
Index[1:32,1] <- "BC1"
Index[33:88,1] <- "LBR"
...
Index <- Index[,-2]
它奏效了,但我确信必须有一些比使用这种复杂的方法更简单的方法,也可以用肉眼计算范围!
解决方案
您可以使用base::strsplit
.
在这里,我sample
在每个_
. 分隔字符列表的第四个元素是我们的索引。我正在使用[4]
insidelapply
来获取每行的第 4 个元素。
s1$Index <- lapply(strsplit(s1$sample, split = "_"), `[`, 4)
# > sample Index
# > 1 Br_LV_0040324_BC1_1 BC1
# > 2 Br_LV_0040324_BC1_2 BC1
# > 3 Br_LV_0040324_BC1_3 BC1
# > 4 Br_LV_0040324_BC1_4 BC1
# > 5 Br_LV_0040324_LBR_1 LBR
# > 6 Br_LV_0040324_LBR_2 LBR
我们还可以使用regex
:
s1$Index <- sub("(?:[^\\_]*\\_){3}([^_]*)([^.*]*)$", "\\1", s1$sample)
请参阅正则表达式演示。
数据:
s1 <- read.table(text="sample
Br_LV_0040324_BC1_1
Br_LV_0040324_BC1_2
Br_LV_0040324_BC1_3
Br_LV_0040324_BC1_4
Br_LV_0040324_LBR_1
Br_LV_0040324_LBR_2", header = T, stringsAsFactor=F)
推荐阅读
- typescript - 错误:TS2339 [错误]:属性 x 不存在...在 Deno 编译
- html - Justify-content: space-between 不适用于嵌套的弹性盒子
- flutter - Flutter:ScanResult库外围扫描返回Null
- python - 如何对使用 pytorch 开发的 CNN 模型进行 3-d 可视化?
- python - 在数据框行中搜索特定字符串,如果存在字符串,则在 python 的另一列中标记
- python-3.x - 如何将今天的日期放在 Python 数据框中每一行的第一列?
- javascript - puppeteer 不等待前一个循环迭代完成
- html - 调整浏览器大小时如何让html控件一起移动
- react-native - React 原生简单动画
- ios - Google Firestore 和/或其实时数据库是否具有按位置(x 英里内)、按日期排序和限制获取帖子的查询功能?