Найти количество элементов по ряду, за исключением - PullRequest
0 голосов
/ 25 марта 2020

У меня есть набор следующей формы: -

a <- data.frame(X1=c("A", "B", "C", "D", "0"),
                X2=c("B", "A", "D", "E", "A"),
                X3=c("0", "0", "B", "A", "0"),
                X4=c("A", "0", "A", "0", "0")
                )

#                          a
#                    X1  X2  X3  X4
#                    A   B   0   A
#                    B   A   0   0
#                    C   D   B   A
#                    D   E   A   0
#                    0   A   0   0

Что я хочу знать, если в каждой строке, сколько элементов, кроме "0", и сохранить их в новом столбце. Ожидаемый результат должен быть: -

#            b
#            3
#            2
#            4
#            3
#            1

Дубликаты должны учитываться как разные, ie, если строка состоит из 2 "A", 1 "B" и "0", она должна вернуть 3. Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 25 марта 2020

Мы могли бы сравнить фрейм данных с 0 и использовать rowSums для вычисления количества записей, кроме 0 в каждой строке.

rowSums(a != 0)
#[1] 3 2 4 3 1

Хотя в этом нет необходимости (поскольку применение rowSums прямолинейно), мы также можем использовать apply по строкам:

apply(a!= 0 , 1, sum)
1 голос
/ 25 марта 2020

Мы можем использовать lengths с split

lengths(split(a[a!=0], row(a)[a  != 0]))
1 голос
/ 25 марта 2020

Если у вас есть один символ в каждой ячейке фрейма данных a, то здесь есть базовая опция R. В противном случае (если у вас есть несколько символов в некоторых ячейках), пожалуйста, перейдите к подходу: @ Ронак Шах

a$b <- nchar(gsub("0","",do.call(paste0,a)))

такой, что

> a
  X1 X2 X3 X4 b
1  A  B  0  A 3
2  B  A  0  0 2
3  C  D  B  A 4
4  D  E  A  0 3
5  0  A  0  0 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...