Есть ли функция для создания на основе индекса наличия значения в столбцах? - PullRequest
0 голосов
/ 08 апреля 2020
 CARDID BSTN BSTN2 BSTN3 BSTN4 BSTN5
 5786  150     0     0     0     0
 9737  150     0     0     0     0
45924  150   151   154     0     0
66405  150     0     0     0     0
91720  150     0     0  4233     0
96172  150     0     0     0  3000  

Нужный результат - это новый столбец, добавленный к этому фрейму данных с количеством значений, присутствующих в макс. BSTN (n).

, поэтому для первой строки результат нового столбца будет быть 1, поскольку только BSTN 1 имеет значение.

для пятой строки результат будет 4, так как BSTN 4 имеет существующее значение. с теми же логами c результаты новых столбцов будут выглядеть следующим образом.

 CARDID BSTN BSTN2 BSTN3 BSTN4 BSTN5 NTF
 5786  150     0     0     0     0    1
 9737  150     0     0     0     0    1
45924  150   151   154     0     0    3
66405  150     0     0     0     0    1
91720  150     0     0  4233     0    4
96172  150     0     0     0  3000    5

1 Ответ

1 голос
/ 08 апреля 2020

Мы можем использовать max.col с ties.method = "last", чтобы получить номер столбца последнего ненулевого значения.

df$NTF <- max.col(df[-1] != 0, ties.method = "last")
df

#  CARDID BSTN BSTN2 BSTN3 BSTN4 BSTN5 NTF
#1   5786  150     0     0     0     0   1
#2   9737  150     0     0     0     0   1
#3  45924  150   151   154     0     0   3
#4  66405  150     0     0     0     0   1
#5  91720  150     0     0  4233     0   4
#6  96172  150     0     0     0  3000   5

Если у вас есть другие столбцы до и / или после "BSTN" столбцов, мы можем использовать grep, чтобы выбрать только те столбцы, которые нам интересны.

cols <- grep('^BSTN', names(df))
df$NTF <- max.col(df[cols] != 0, ties.method = "last")

Мы также можем использовать apply построчно:

apply(df[-1], 1, function(x) max(which(x != 0)))
#[1] 1 1 3 1 4 5

данные

df <- structure(list(CARDID = c(5786L, 9737L, 45924L, 66405L, 91720L, 
96172L), BSTN = c(150L, 150L, 150L, 150L, 150L, 150L), BSTN2 = c(0L, 
0L, 151L, 0L, 0L, 0L), BSTN3 = c(0L, 0L, 154L, 0L, 0L, 0L), BSTN4 = c(0L, 
0L, 0L, 0L, 4233L, 0L), BSTN5 = c(0L, 0L, 0L, 0L, 0L, 3000L)), 
class = "data.frame", row.names = c(NA, -6L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...