我有一个包含超过一千行样本名称非常长的数据框,因此我想添加一个分类索引。
例如这个数据框:
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
列。分隔字符列表的第四个元素是我们的索引。我在 lapply
中使用 [4]
来获取每行的第 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
我们还可以使用正则表达式
:
s1$Index <- sub("(?:[^\\_]*\\_){3}([^_]*)([^.*]*)$", "\\1", s1$sample)
参见 Regex Demo .
数据:
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)
关于r - 如何为特定范围创建和插入带有分类变量的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59995753/