首先,我为如此骇人听闻的问题道歉。我无法想出一个更好,更简洁的写作方式,所以希望下面的内容有助于说清楚 - 任何提高其清晰度的建议都是受欢迎的,以便让未来的人们更容易接触到同样的事情。
我正在使用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
但无法弄清楚如何产生这样的输出。请注意,在重复条目的情况下,布尔数据已经组合在一起,因此真值保持在假值之上。我一直在关注聚合函数,但没有运气强迫它执行上述操作。
有可能这样做吗?感谢您抽出宝贵时间阅读我的问题。
答案 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))