фильтрация данных по столбцам по столбцам - PullRequest
2 голосов
/ 28 января 2020

У меня есть следующий df.

empid  cond1  cond2  cond3 cond4
234     1      0      1     1
7890    2      1      1     0
38476   1      1      0     1
456     0      1      1     0

Столбец empid имеет тип символов, а остальные - числовые c столбцы. Мне нужен список empids для каждого cond1, cond2, cond3 и cond4, которые имеют значения больше 0. Сейчас я создаю список имен столбцов от 2: 5, используя для l oop, чтобы перебрать выберите столбцы и затем отфильтруйте их по этому конкретному столбцу.

Мне кажется, что это можно сделать более эффективно с помощью lapply, но я не уверен, как включить столбцы для выбора, поскольку мне нужен только столбец empid в моем результате.

В качестве выходных данных может работать новый объект списка, содержащий значения фильтрованного empid. Так, например, что-то вроде: новый объект списка,

cond1 <- "234","7890","38476"

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Вот решение с помощью базы R,

aggregate(empid ~ ind, subset(cbind(empid = df$empid, stack(df[-1])), values > 0), list)

#    ind            empid
#1 cond1 234, 7890, 38476
#2 cond2 7890, 38476, 456
#3 cond3   234, 7890, 456
#4 cond4       234, 38476

ПРИМЕЧАНИЕ:

Если мы сохраним empid как символ, это будет путать stack с фактором. Чтобы избежать этого, мы можем добавить as.integer() в subset, то есть

aggregate(empid ~ ind, subset(cbind(empid = as.integer(df$empid), stack(df[-1])), values > 0), list)
1 голос
/ 28 января 2020

Один dplyr параметр может быть:

df %>%
 mutate_at(vars(starts_with("cond")), ~ list(empid[. != 0]))

  empid            cond1            cond2          cond3      cond4
1   234 234, 7890, 38476 7890, 38476, 456 234, 7890, 456 234, 38476
2  7890 234, 7890, 38476 7890, 38476, 456 234, 7890, 456 234, 38476
3 38476 234, 7890, 38476 7890, 38476, 456 234, 7890, 456 234, 38476
4   456 234, 7890, 38476 7890, 38476, 456 234, 7890, 456 234, 38476

Если вы хотите сохранить его в длинном формате, с добавлением tidyr:

df %>%
 pivot_longer(-empid, names_to = "condition") %>%
 group_by(condition) %>%
 summarise(empid = list(empid[value != 0]))

  condition empid    
  <chr>     <list>   
1 cond1     <int [3]>
2 cond2     <int [3]>
3 cond3     <int [3]>
4 cond4     <int [2]>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...