Как я могу проверить количество столбцов в data.table для указанного значения c, используя R - PullRequest
2 голосов
/ 24 апреля 2020

Это мои примеры данных

test <- data.table(name  = c("mike", "kate", "jeff"), ownership = c("1", "3", "4"), worth = c("1", "2", "3"), tax = c("4", "1", "4"))  

Я пытаюсь проверить, есть ли в строках (людях) строка, содержащая «1».

Я могу сделать это следующим образом

test <- test[ownership == "1" | worth == "1" | tax == "1", status := "yes"]

, но я хотел бы сделать это немного более кратким. Что-то вроде:

test <- test[any(c("ownership", "worth", "tax") %in% "1"), status := "yes"]

Ответы [ 2 ]

4 голосов
/ 24 апреля 2020

Вы можете использовать rowSums:

cols <- c('ownership', 'worth', 'tax')
setDT(test)[rowSums(test[, ..cols] == 1) > 0, yes := 'yes']
test

#   name ownership worth tax  yes
#1: mike         1     1   4  yes
#2: kate         3     2   1  yes
#3: jeff         4     3   4 <NA>

Другой вариант, предложенный @ chinsoon12

setDT(test)[test[, .I[rowSums(.SD==1L)], .SDcols=cols], status := "yes"] 
0 голосов
/ 24 апреля 2020

Мы можем использовать Reduce с .SD (data.table методами)

cols <- c('ownership', 'worth', 'tax')
i1 <- test[, Reduce(`+`, lapply(.SD, `==`, 1)) > 0, .SDcols = cols]
test[i1, yes := 'yes']
test
#   name ownership worth tax  yes
#1: mike         1     1   4  yes
#2: kate         3     2   1  yes
#3: jeff         4     3   4 <NA>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...