我认为这将是一项相对容易完成的任务,但我在这里找不到不专注于根据列条件总结行的示例。我想要实现的是总结列重复,但保持行唯一。
这就是我的意思:
MKC100.1 MKC100.2 MKC100.3 MKC103.1 MKC103.2 MKC103.3 MKC104.2 MKC104.3
299fc0ac11fb4afd0da849a2c45583b3 0 0 0 0 0 0 0 1
9bc2bacdfadf4c1352ffbc991803287c 1183 1666 1318 0 0 0 10 20
38b782d9f01c69c3570fe0edd5864dc0 493 626 543 10 0 0 5 5
6d078397349f7d39c34d237a6ef4cb75 43735 51511 46876 0 0 0 1 0
c22e752b441ee4190f27a3690c5d1206 0 0 0 2795 1128 1956 1 1
f6513affb198fb9845741b61ece8db4b 59 58 82 0 0 0 0 0
structure(list(MKC100.1 = c(0L, 1183L, 493L, 43735L, 0L, 59L),
MKC100.2 = c(0L, 1666L, 626L, 51511L, 0L, 58L), MKC100.3 = c(0L,
1318L, 543L, 46876L, 0L, 82L), MKC103.1 = c(0L, 0L, 10L,
0L, 2795L, 0L), MKC103.2 = c(0L, 0L, 0L, 0L, 1128L, 0L),
MKC103.3 = c(0L, 0L, 0L, 0L, 1956L, 0L), MKC104.2 = c(0L,
10L, 5L, 1L, 1L, 0L), MKC104.3 = c(1L, 20L, 5L, 0L, 1L, 0L
)), class = "data.frame", row.names = c("299fc0ac11fb4afd0da849a2c45583b3",
"9bc2bacdfadf4c1352ffbc991803287c", "38b782d9f01c69c3570fe0edd5864dc0",
"6d078397349f7d39c34d237a6ef4cb75", "c22e752b441ee4190f27a3690c5d1206",
"f6513affb198fb9845741b61ece8db4b"))
Run Code Online (Sandbox Code Playgroud)
重复通常有三个,但末尾会附加“.1”或“.2”或“.3”。我需要将这些全部合并起来,以便最终得到如下所示的数据框:
MKC100 MKC103 MKC104
299fc0ac11fb4afd0da849a2c45583b3 0 0 1
9bc2bacdfadf4c1352ffbc991803287c 4167 0 30
38b782d9f01c69c3570fe0edd5864dc0 1662 10 10
6d078397349f7d39c34d237a6ef4cb75 142122 0 1
c22e752b441ee4190f27a3690c5d1206 0 5879 2
f6513affb198fb9845741b61ece8db4b 199 0 0
Run Code Online (Sandbox Code Playgroud)
编辑有时重复会被删除,并且我不会在数据框中每个样本都有所有三个重复。任何重复仍应合并在一起。我已更新示例数据以反映这种情况。
out <- lapply(split(names(data), sub("\\\\..*", "", names(data))),\n function(nms) rowSums(data[,nms])) |>\n data.frame()\nout\n# MKC100 MKC103\n# 299fc0ac11fb4afd0da849a2c45583b3 0 0\n# 9bc2bacdfadf4c1352ffbc991803287c 4167 0\n# 38b782d9f01c69c3570fe0edd5864dc0 1662 10\n# 6d078397349f7d39c34d237a6ef4cb75 142122 0\n# c22e752b441ee4190f27a3690c5d1206 0 5879\n# f6513affb198fb9845741b61ece8db4b 199 0\nRun Code Online (Sandbox Code Playgroud)\n稍微不同的方法,我们将旋转/总结/逆旋转:
\nlibrary(dplyr)\nlibrary(tidyr)\ndata |>\n tibble::rownames_to_column() |>\n pivot_longer(cols = -rowname) |>\n mutate(name = sub("\\\\..*", "", name)) |>\n summarize(value = sum(value), .by = c(rowname, name)) |>\n pivot_wider(id_cols = rowname)\n# # A tibble: 6 \xc3\x97 3\n# rowname MKC100 MKC103\n# <chr> <int> <int>\n# 1 299fc0ac11fb4afd0da849a2c45583b3 0 0\n# 2 9bc2bacdfadf4c1352ffbc991803287c 4167 0\n# 3 38b782d9f01c69c3570fe0edd5864dc0 1662 10\n# 4 6d078397349f7d39c34d237a6ef4cb75 142122 0\n# 5 c22e752b441ee4190f27a3690c5d1206 0 5879\n# 6 f6513affb198fb9845741b61ece8db4b 199 0\nRun Code Online (Sandbox Code Playgroud)\n|> tibble::column_to_rownames()如果您需要返回它们而不是列,则可以添加它们。
library(purrr)\nout <- split(names(data), sub("\\\\..*", "", names(data))) |>\n map_dfc(~ rowSums(data[,.x])) |>\n as.data.frame()\nrownames(out) <- rownames(data)\nout\n# MKC100 MKC103\n# 299fc0ac11fb4afd0da849a2c45583b3 0 0\n# 9bc2bacdfadf4c1352ffbc991803287c 4167 0\n# 38b782d9f01c69c3570fe0edd5864dc0 1662 10\n# 6d078397349f7d39c34d237a6ef4cb75 142122 0\n# c22e752b441ee4190f27a3690c5d1206 0 5879\n# f6513affb198fb9845741b61ece8db4b 199 0\nRun Code Online (Sandbox Code Playgroud)\n使用as.data.frame是为了将其从 tibble 中更改,因为 tidyverse 和 tibbles 特别偏向于行名称。
您可能需要考虑完全丢弃行名称,或者将它们作为列放入框架中(正如我在rownames_to-column上面所做的那样,可以在基本 R 中使用 轻松完成data$rowname <- rownames(data))。