Р: Возможно ли объединить логические данные в несколько столбцов выбора частично дублированных строк? - PullRequest
0 голосов
/ 04 июня 2018

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

Я работаю с кадром данных в R, который содержит несколько строк с дублирующимися тегами ID.Есть четыре столбца, связанных с каждой строкой, которые содержат логические значения, и в каждой строке только один регистрируется как true, таким образом, что, если тег ID повторяется, столбцы, в которых логическое значение равно true, будут отличаться.Ниже приведен очень короткий пример раздела данных, с которыми я работаю:

dbsid     l_e      l_d      n_e      b_c
CCH00090  TRUE     FALSE    FALSE    FALSE
CCH00091  FALSE    FALSE    TRUE     FALSE
CCH00090  FALSE    TRUE     FALSE    FALSE

Я надеюсь получить следующее (хотя и в гораздо большем масштабе):

dbsid     l_e      l_d      n_e      b_c
CCH00090  TRUE     TRUE     FALSE    FALSE
CCH00091  FALSE    FALSE    TRUE     FALSE

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

Возможно ли это сделать?Спасибо, что нашли время, чтобы прочитать мой вопрос.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Вы можете сделать это с помощью summarize_all из dplyr:

library(dplyr)

df %>%
  group_by(dbsid) %>%
  summarize_all(sum)

Результат:

# A tibble: 2 x 5
     dbsid   l_e   l_d   n_e   b_c
    <fctr> <int> <int> <int> <int>
1 CCH00090     1     1     0     0
2 CCH00091     0     0     1     0

или any (@Ryan):

df %>%
  group_by(dbsid) %>%
  summarize_all(any)

Результат:

# A tibble: 2 x 5
     dbsid   l_e   l_d   n_e   b_c
    <fctr> <lgl> <lgl> <lgl> <lgl>
1 CCH00090  TRUE  TRUE FALSE FALSE
2 CCH00091 FALSE FALSE  TRUE FALSE

Данные:

df = structure(list(dbsid = structure(c(1L, 2L, 1L), .Label = c("CCH00090", 
"CCH00091"), class = "factor"), l_e = c(TRUE, FALSE, FALSE), 
    l_d = c(FALSE, FALSE, TRUE), n_e = c(FALSE, TRUE, FALSE), 
    b_c = c(FALSE, FALSE, FALSE)), .Names = c("dbsid", "l_e", 
"l_d", "n_e", "b_c"), class = "data.frame", row.names = c(NA, 
-3L))
0 голосов
/ 04 июня 2018

Вы можете применить функцию any ко всем строкам, имеющим одинаковые dbsid, для всех переменных.

library(data.table)
setDT(df)

df[, lapply(.SD, any), by = dbsid]

#       dbsid   l_e   l_d   n_e   b_c
# 1: CCH00090  TRUE  TRUE FALSE FALSE
# 2: CCH00091 FALSE FALSE  TRUE FALSE

Используемые данные

df <- fread("dbsid     l_e      l_d      n_e      b_c
CCH00090  TRUE     FALSE    FALSE    FALSE
CCH00091  FALSE    FALSE    TRUE     FALSE
CCH00090  FALSE    TRUE     FALSE    FALSE")
...