Подсчет количества строк, в которых значение встречается хотя бы один раз во многих столбцах - PullRequest
0 голосов
/ 05 апреля 2019

Я обновил вопрос с помощью псевдокода, чтобы лучше объяснить, что я хотел бы сделать.

У меня есть data.frame с именем df_sel , с 5064 строками и 215 столбцами.

В некоторых столбцах (~ 80) содержатся целые числа с уникальным идентификатором для определенной черты (лекарства).Эти столбцы называются «meds_0_1», «meds_0_2», «meds_0_3» и т. Д., А также «meds_1_1», «meds_1_2», «meds_1_3».Каждый столбец может содержать или не содержать какие-либо целочисленные значения, которые я ищу.

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

metformin = 1140884600  # not grouped
sulfonylurea = c(1140874718, 1140874724, 1140874726) # grouped

Если бы можно было найти группу лекарств, как в векторном формате, как указано выше, это было бы полезно.

Я бы хотел сделать это:

IF [a specific row] 
CONTAINS [the single integer value of interest] 
IN [any of the columns within the df starting with "meds_0"] 
A_NEW_VARIABLE_METFORMIN = 1 ELSE A_NEW_VARIABLE_METFORMIN = 0

и соответственно

IF [a specific row] 
CONTAINS [any of multiple integer values of interest] 
IN [any of the columns within the df starting with "meds_0"] 
A_NEW_VARIABLE_SULFONYLUREA = 1 ELSE A_NEW_VARIABLE_SULFONYLUREA = 0

Мне удалось создать вектор на основе имен столбцов:

column_names <- names(df_sel) %>% str_subset('^meds_0')

Но я не получил ничего, несмотря нанекоторые предложения ниже.

Надеюсь, вы лучше понимаете, что я пытаюсь сделать.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Во-первых, я хотел бы начать с рекомендации биокондуктора для библиотек R, поскольку, похоже, вы изучаете биологические данные. Теперь к вашему вопросу.

Хотя tidyverse является наиболее широко приемлемым и «легким» методом, я бы рекомендовал в этом случае использовать «lapply», поскольку он очень быстрый. Как вы сказали, ваш код с точки зрения программирования становится простым логическим значением, но я думаю, что мы можем пойти немного дальше. Используя встроенные данные из 'mtcars',

data(mtcars)
head(mtcars, 6)
target=6

#trues and falses for each row and column

rows=lapply(mtcars, function(x) x %in% target)

#Number of Trues for each column and which have more that 0 Trues

column_sums=unlist(lapply(rows, function(x) (sum(x, na.rm = TRUE))))
which(column_sums>0)

Это будет работать с другими типами данных с некоторыми изменениями тут и там.

0 голосов
/ 05 апреля 2019

Что касается выбора столбцов, вы можете сделать это, сначала извлекая имена так же, как вы делаете это с регулярным выражением, а затем используя select:

library(stringr)
column_names <- names(df_sel) %>% 
  str_subset('^meds_0')

relevant_df <- df_sel %>%
  select(column_names)

Я не совсем понял структуру ваших переменных (если они целые, логические и т. Д.), Поэтому я не уверен, как продолжить, но это, вероятно, потребует чего-то вроде суммирования по всем столбцам и отбрасывания те, которые не равны 0, например:

meds_taken <- rowSums(relevant_df)
df_sel_med_count <- df_sel %>% 
  add_column(meds_taken)

В этот момент у вас должен быть ваш начальный df с соответствующими данными в одном столбце, и вы можете суммировать по предмету, лекарству или как угодно любым другим способом.

Если этого недостаточно, отредактируйте ваш вопрос, предоставив соответствующий образец ваших данных (вы можете сделать это с помощью функции dput), и я отредактирую этот ответ, чтобы добавить больше деталей.

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