Повторяющаяся функция над именами переменных - PullRequest
3 голосов
/ 09 июля 2020

Используя следующий фрейм данных (похожий на мои данные, но намного меньше):

id <- c(1:10)
clo_a <- c(rep(c("Yes","No"), 5))
clo_f <- c(rep(c(4,5), 5))
man_a <- c(rep(c("Yes","No"), each = 5))
man_f <- c(rep(c(c(3,7)), each = 5))
pho_a <- c(rep(c(NA, NA, "Yes", NA, "No"), 2))
pho_f <- c(rep(c(1,2,3,4,5), 2))

ds <- data.frame(id, clo_a, clo_f, man_a, man_f, pho_a, pho_f)

создает ds фрейма данных следующим образом:

   id clo_a clo_f man_a man_f pho_a pho_f
1   1   Yes     4   Yes     3  <NA>     1
2   2    No     5   Yes     3  <NA>     2
3   3   Yes     4   Yes     3   Yes     3
4   4    No     5   Yes     3  <NA>     4
5   5   Yes     4   Yes     3    No     5
6   6    No     5    No     7  <NA>     1
7   7   Yes     4    No     7  <NA>     2
8   8    No     5    No     7   Yes     3
9   9   Yes     4    No     7  <NA>     4
10 10    No     5    No     7    No     5

Теперь я хочу выбрать идентификатор переменных, оканчивающихся на _a с «Да», но также и значения переменных, заканчивающихся на _f, хотя в идеале отдельно.

В качестве одного примера я могу написать:

upset_clo_a <- ds$id[which( ds$clo_a == "Yes")]

производя:

> upset_clo_a
[1] 1 3 5 7 9

Теперь я бы хотел повторить это для всех переменных, в идеале используя вектор с общим знаменателем в наборе переменных, например:

ai_list <- c("clo", "man", "pro")

Очевидно следующее пример не работает. Я пробовал несколько вариантов использования paste() или substitute(), но ничего полезного не дало.

lapply(ai_list, function(x) {
  upset_x <- ds$id[which( ds$x == "Yes")]
})

Результат одинаков для всех вариантов, которые я пробовал:

[[1]]
integer(0)

[[2]]
integer(0)

[[3]]
integer(0)

В end Я хочу (например) прочитать ID-векторы для каждой переменной (например, upset_clo_f) как список векторов в графике upSet. Может у вас есть отличная идея. Спасибо!

1 Ответ

2 голосов
/ 09 июля 2020

Вы можете вставить недостающую часть (_a) в каждый векторный элемент и использовать ее для подмножества вашего data.frame. Затем l oop по этим столбцам и получите индекс Yes, т.е.

sapply(ds[names(ds) %in% paste0(ai_list, '_a')], function(i)which(i == 'Yes'))

Разбивка кода

  • paste0(ai_list, '_a') - Вставляет суффикс [_ a] к каждому имени (clo_a, man_a, pro_a)
  • names(ds) %in% paste0(ai_list, '_a') - возвращает логический вектор (ИСТИНА, ЛОЖЬ), который будет использоваться для дополнительной настройки столбцов представляющих интерес
  • ds[names(ds) %in% paste0(ai_list, '_a')] - возвращает фрейм данных только с интересующими столбцами (в соответствии с логическими условиями из шага выше)
  • sapply(ds[names(ds) %in% paste0(ai_list, '_a')], function(i)which(i == 'Yes')) - Наконец, мы l oop над столбцы и примените функцию which(), чтобы получить индексы YES
...