R 如何从另一个向量中获取包含具有相应值的字符的矩阵的行和
嗨,我从我的数据中提取了此列:R 如何从另一个向量中获取包含具有相应值的字符的矩阵的行和,r,matrix,R,Matrix,嗨,我从我的数据中提取了此列: x <- data.frame(Category=factor(c("xxyyxyxyx", "xxyyyyxyx", "xxyyxyxyy", "yxyyxyxyx", "xxyyxyyyx"))) > x Category 1 xxyyxyxyx 2 xxyyyyxyx 3 xxyyxyxyy 4 yxyyxyxyx 5 xxyyxyyyx 我想根据矩阵xx在矩阵x中添加一列,包含每行的总和,即 x Categ
x <- data.frame(Category=factor(c("xxyyxyxyx", "xxyyyyxyx", "xxyyxyxyy",
"yxyyxyxyx", "xxyyxyyyx")))
> x
Category
1 xxyyxyxyx
2 xxyyyyxyx
3 xxyyxyxyy
4 yxyyxyxyx
5 xxyyxyyyx
我想根据矩阵xx
在矩阵x
中添加一列,包含每行的总和,即
x
Category RowSum
1 xxyyxyxyx 12
2 xxyyyyxyx 14
3 xxyyxyxyy 10
4 yxyyxyxyx 11
5 xxyyxyyyx 17
非常感谢 我们可以使用键/值索引替换'xx'中的值,并获得
行和
x$RowSum <- rowSums(`dim<-`(matval[xx], dim(xx)))
1)matval[xx]
将给出各个值,然后这些值可以重新形成矩阵并求和:
transform(x, RowSum = rowSums(array(matval[xx], dim(xx))))
给予:
Category RowSum
1 xxyyxyxyx 12
2 xxyyyyxyx 14
3 xxyyxyxyy 10
4 yxyyxyxyx 11
5 xxyyxyyyx 17
2)不首先计算xx
而直接从x
计算结果的替代方法如下。它提取每三个字符,并将matval[…]
应用于每个这样的提取,然后对得到的矩阵求和
library(gsubfn)
transform(x, RowSums =
colSums(strapply(paste(Category), "...", s ~ matval[s], simplify = TRUE)))
注意:另一种计算xx
的方法是在每三个字符后插入一个空格,将其读入数据帧并将其转换为矩阵
as.matrix(read.table(text = gsub("(...)", "\\1 ", x$Category)))
或者使用read.fwf
根据3个固定宽度字段(每个字段有3个字符)读取:
as.matrix(read.fwf(textConnection(paste(x$Category)), rep(3, 3)))
或使用子字符串
:
from <- seq(1, 9, 3)
to <- from + 3 - 1
t(sapply(x$Category, substring, from, to))
非常整洁。我刚想建议大家用match
来装模作样。谢谢你的解决方案!如果matval
是一个数据帧,即matval=data.frame(cate=c(“xxy”,“yxy”,“xyx”,“xyy”),val=c(3,2,7,5,12,4)),可以得到相同的结果吗?如果是,您能告诉我具体方法吗?@sdhaoui尝试创建一个命名向量matval1
as.matrix(read.table(text = gsub("(...)", "\\1 ", x$Category)))
as.matrix(read.fwf(textConnection(paste(x$Category)), rep(3, 3)))
from <- seq(1, 9, 3)
to <- from + 3 - 1
t(sapply(x$Category, substring, from, to))