2016-12-28 9 views
0

私は行列のリストを持っています。彼らは特定の列名を持っている場合は、行列の負の要素をゼロに変更したい。以下の例では、列名 '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 [、キーパー] <0、キーパー] < - 0 '私は、このエラーが発生します – Roland

+0

@Roland:' [< - '( '* TMP *'、X [、キーパーでエラーが発生しました] <0、キーパー、値= 0): (下付き文字)論理添字が長すぎます – user3390169

答えて

1

置き換えのために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 
関連する問題