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 
+1

'X [X [,门将] Roland

+0

@Roland,让我这个错误:在'[ user3390169

以下是替代方案,使用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