R矩阵列表 - 基于值和列名更改值
问题描述:
我有一个矩阵列表。如果他们有一个特定的列名称,我想将矩阵的负面元素更改为零。在下面的例子中,我想设置列名为'a'的元素等于零。R矩阵列表 - 基于值和列名更改值
> set.seed(4)
> z<-lapply(1:3, function(x) matrix(sample(-10:10,20, replace=T), nrow=4))
> z<-lapply(z, function(x) {colnames(x)<-c("a","c","b","a","b");x})
> z
[[1]]
a c b a b
[1,] 2 7 9 -8 10
[2,] -10 -5 -9 10 2
[3,] -4 5 5 -2 10
[4,] -5 9 -4 -1 5
[[2]]
a c b a b
[1,] 5 3 0 8 -1
[2,] 10 7 1 3 3
[3,] 0 0 1 0 -2
[4,] 0 7 -5 10 -10
[[3]]
a c b a b
[1,] 9 8 5 8 -7
[2,] -5 -9 1 6 -7
[3,] 1 8 -2 7 8
[4,] -7 8 5 -2 5
这是我试图让:
[[1]]
a c b a b
[1,] 2 7 9 0 10
[2,] 0 -5 -9 10 2
[3,] 0 5 5 0 10
[4,] 0 9 -4 0 5
[[2]]
a c b a b
[1,] 5 3 0 8 -1
[2,] 10 7 1 3 3
[3,] 0 0 1 0 -2
[4,] 0 7 -5 10 -10
[[3]]
a c b a b
[1,] 9 8 5 8 -7
[2,] 0 -9 1 6 -7
[3,] 1 8 -2 7 8
[4,] 0 8 5 0 5
我试过,但它似乎搞砸了其他元素。
> keeper<-which(colnames(z[[1]])=="a")
> lapply(z, function(x) {x[x[,keeper]<0]<-0;x})
[[1]]
a c b a b
[1,] 2 0 9 0 10
[2,] 0 -5 0 10 0
[3,] 0 0 0 0 0
[4,] 0 0 0 0 0
[[2]]
a c b a b
[1,] 5 3 0 8 -1
[2,] 10 7 1 3 3
[3,] 0 0 1 0 -2
[4,] 0 7 -5 10 -10
[[3]]
a c b a b
[1,] 9 8 5 8 -7
[2,] 0 -9 0 6 0
[3,] 1 8 -2 7 8
[4,] 0 0 0 0 0
答
以下是替代方案,使用pmax
进行替换。
lapply(z, function(x) {x[, colnames(x) == "a"] <- pmax(x[, colnames(x) == "a"], 0); x})
[[1]]
a c b a b
[1,] 2 7 9 0 10
[2,] 0 -5 -9 10 2
[3,] 0 5 5 0 10
[4,] 0 9 -4 0 5
[[2]]
a c b a b
[1,] 5 3 0 8 -1
[2,] 10 7 1 3 3
[3,] 0 0 1 0 -2
[4,] 0 7 -5 10 -10
[[3]]
a c b a b
[1,] 9 8 5 8 -7
[2,] 0 -9 1 6 -7
[3,] 1 8 -2 7 8
[4,] 0 8 5 0 5
'X [X [,门将] Roland
@Roland,让我这个错误:在'[ user3390169