R:当模式是向量时顺序应用grep并将结果绑定到矩阵

R: Applying grep sequentially when pattern is a vector and bind results to a matrix

我有一个具有以下 3 部分名称结构的命名矩阵 (xxx-#h-#):

    xxx-0h-0 | xxx-0h-1 | xxx-0h-2 | xxx-1h-0 | ... | xxx-60h-2
v1
v2
v3
...
vn

我试图找出哪些列共享一个名称,该名称是用名称的前两部分的串联搜索的,其中 xxx 是一个固定值,变量 "names" 包含所有可能的值中间位置。最后一个位置是可变的。

names <- c("0h","1h","6h","16h","24h","42h","60h")
names <-paste("XXX",names,sep=" ")

我正在使用 grep 进行查找:

grep(names[1],colnames(x))

哪个正确 returns:

[1] 1 2 3

然后我尝试通过 cbind 合并结果列,然后获取共享第一列和第二列命名位置的所有观察值的平均值,并将其分配给新变量。

在哪里

xxx-1h <- rowMeans(cbind(x[,grep(names[1],colnames(x))]))

会给我从 grep 之前找到的第 1、2、3 列计算的相应平均值,

当我未能指定 "names" 向量的子集时,我收到以下错误:

Warning message:
In grep(names, colnames(x)) :
  argument 'pattern' has length > 1 and only the first element will be used

我怎样才能在序列中合并第一个元素以外的元素?

基本上,我希望发生以下情况:

xxx-0H <- rowMeans(cbind(x[,grep(names[1],colnames(x))]))
xxx-1H <- rowMeans(cbind(x[,grep(names[2],colnames(x))]))
xxx-6H <- rowMeans(cbind(x[,grep(names[3],colnames(x))]))
xxx-16H <- rowMeans(cbind(x[,grep(names[4],colnames(x))]))
xxx-24H <- rowMeans(cbind(x[,grep(names[5],colnames(x))]))
xxx-42H <- rowMeans(cbind(x[,grep(names[6],colnames(x))]))
xxx-60H <- rowMeans(cbind(x[,grep(names[7],colnames(x))]))

并将每个生成的整数向量连接成一个保留行命名方案(在所有列之间共享)的矩阵,同时从列名称中省略最后一位数字(xxx-0H | xxx-1H | xxx -2H)。我最终会得到一个 7 列、n 行的矩阵。

我最后的选择是使用 for 循环。有没有一种优雅的方法可以使用 apply 或其任何变体来做到这一点?

编辑:好的,我现在明白你在找什么了。这是一个完整的示例,从共享中间名的两对列开始。

mid <- c("0h", "6h")
name <- paste(rep("XXX", 4), rep(mid, each = 2), 1:2, sep="-")
df = setNames(cbind(cars, cars), name)
df = df[1:4, ]
df
#   XXX-0h-1 XXX-0h-2 XXX-6h-1 XXX-6h-2
# 1        4        2        4        2
# 2        4       10        4       10
# 3        7        4        7        4
# 4        7       22        7       22

设置好数据后,在 table 上调用 rowMeans 的次数与中间名的数量一样多,每次都将 table 子集化为名称包含给定名称的列中间名。

sapply(mid, function(x) rowMeans(df[grep(x, names(df))]))
#     0h   6h
# 1  3.0  3.0
# 2  7.0  7.0
# 3  5.5  5.5
# 4 14.5 14.5