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
我有一个具有以下 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