r - 如何为特定范围创建和插入带有分类变量的列

标签 r regex string dataframe

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

例如这个数据框:

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/

相关文章:

r - 使用每列使用不同参数的函数转换多列

r - 在R中解析数据时出错

Java正则表达式检测SimpleDateFormat模式中的时区

java - 与java正则表达式的反向匹配

java - 对字符串和 null 关键字的 Concat 操作

arrays - 如何在 Rust 中将一串数字转换为数组或整数向量?

java - Java中使用递归方法计算字符串中的特定字符

r - ggplot2:多个带有框和标签的图

r - 如何替换NULL/? r 中的 'None' 或 '0'

正则表达式基本行返回