首页 > 解决方案 > 如何为特定范围创建和插入包含分类变量的列

问题描述

我有一个包含一千多行样本名称很长的数据框,因此想添加一个分类索引。

例如对于这个数据框:

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]

它奏效了,但我确信必须有一些比使用这种复杂的方法更简单的方法,也可以用肉眼计算范围!

标签: rregexstringdataframe

解决方案


您可以使用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)

推荐阅读