R:是否可以在部分重复的行的多个选择列中组合布尔数据?

时间:2018-06-04 19:05:45

标签: r dataframe duplicates boolean aggregate

首先,我为如此骇人听闻的问题道歉。我无法想出一个更好,更简洁的写作方式,所以希望下面的内容有助于说清楚 - 任何提高其清晰度的建议都是受欢迎的,以便让未来的人们更容易接触到同样的事情。

我正在使用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 :(得分:3)

对于所有变量,您可以在具有相同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")

答案 1 :(得分:3)

您可以使用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))