Как я могу использовать rowSums с условиями для возврата двоичного значения? - PullRequest
0 голосов
/ 15 октября 2018

Скажем, у меня есть фрейм данных со столбцом для суммированных данных.Каков наиболее эффективный способ возврата двоичного 0 или 1 в новом столбце, если любое значение в столбцах a, b или c НЕ равно нулю?rowSums подходит для общего числа, но мне также нужен простой индикатор, если что-то отличается от значения.

tt <- data.frame(a=c(0,-5,0,0), b=c(0,5,10,0), c=c(-5,0,0,0))
tt[, ncol(tt)+1] <- rowSums(tt)

Это дает:

> tt
   a  b  c V4
1  0  0 -5 -5
2 -5  5  0  0
3  0 10 10 20
4  0  0  0  0

Четвертый столбец простойсумма данных в первых трех столбцах.Как добавить пятый столбец, который возвращает двоичное значение 1/0, если какое-либо значение отличается от критерия, установленного в первых трех столбцах?

Например, есть ли простой способ вернуть 1, если любой из a, b или c НЕ равен 0?

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

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

+(Reduce(`|`, lapply(tt, `!=`, 0)))
#[1] 1 1 1 0
0 голосов
/ 15 октября 2018

Можно также использовать старый добрый цикл apply:

+apply(tt != 0, 1, any)
#[1] 1 1 1 0

Аргумент tt != 0 представляет собой логическую матрицу с записями, указывающими, отличается ли значение от нуля.Затем apply() с полем 1 используется для построчной операции, чтобы проверить, является ли any записей true.Префикс + преобразует логический вывод в числовой 0 или 1. Это сокращенная версия as.numeric().

0 голосов
/ 15 октября 2018
as.numeric(rowSums(tt != 0) > 0)
# [1] 1 1 1 0

tt != 0 дает нам логическую матрицу, сообщающую нам, где в tt есть значения, не равные нулю.

Когда сумма каждой строки больше нуля (rowSums(tt != 0) > 0), мы знаем, что хотя бы одно значение в этой строке не равно нулю.

Затем мы конвертируем результат в числовое значение (as.numeric(.)) и мы получили двоичный векторный результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...