Измените столбец с теми же значениями на столбец всех нулей в R - PullRequest
0 голосов
/ 23 октября 2019

Предположим, у меня есть список с именем: LS1, и в этом списке у меня есть 20 матриц по 100 на 5. Теперь у некоторых столбцов может быть только одно значение, повторяемое, как один столбец - все 100. Я хочу сделать все эти 100 равными нулю. ,Я могу написать цикл for, чтобы сделать это, но я хочу сделать это более эффективно с помощью lapply и apply. Например, один пример этой матрицы:

1 2 3 4 5
1 3 4 5 6
1 5 6 8 9

Я хочу, чтобы первый столбец, состоящий из всех единиц, был заменен на все нули.

Вот что я сделал:

A= lapply(LS1, function(x) {apply(x,2,function(x1)  {if(max(x1)== min(x1)) 
    {0}}}

но это делает все значения NULL. Кто-нибудь может предложить сделать это с lapply и применить?

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Это должно работать, особенно для целочисленных матриц.

lapply(lst, 
       function(mat) {
          all_dupes = apply(mat, 2, function(x) length(unique(x)) ==1)
          mat[, all_dupes]  = 0L
          return(mat)
         }
)
0 голосов
/ 23 октября 2019

Это мое решение:

df <- data.frame(a = c(1, 1, 1), 
               b = c(2, 3, 5), 
               c = c(4, 5, 8),
               d = c(5, 6, 9), 
               e = c(5, 5, 5))

A = data.frame(lapply(df, function(x)  x = (max(x)!=min(x))*x ))
A
> A
  a b c d e
1 0 2 4 5 0
2 0 3 5 6 0
3 0 5 8 9 0

Если использовать sapply:

A = sapply(df, function(x)  x = (max(x)!=min(x))*x)
A
     a b c d e
[1,] 0 2 4 5 0
[2,] 0 3 5 6 0
[3,] 0 5 8 9 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...