总结数据框中的重复列,保持行唯一

Kat*_*hau 4 pivot r reshape

我认为这将是一项相对容易完成的任务,但我在这里找不到不专注于根据列条件总结行的示例。我想要实现的是总结列重复,但保持行唯一。

这就是我的意思:

                                 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)

编辑有时重复会被删除,并且我不会在数据框中每个样本都有所有三个重复。任何重复仍应合并在一起。我已更新示例数据以反映这种情况。

r2e*_*ans 7

碱基R

\n
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\n
Run Code Online (Sandbox Code Playgroud)\n

dplyr+tidyr

\n

稍微不同的方法,我们将旋转/总结/逆旋转:

\n
library(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\n
Run Code Online (Sandbox Code Playgroud)\n

|> tibble::column_to_rownames()如果您需要返回它们而不是列,则可以添加它们。

\n

咕噜咕噜

\n
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\n
Run Code Online (Sandbox Code Playgroud)\n

使用as.data.frame是为了将其从 tibble 中更改,因为 tidyverse 和 tibbles 特别偏向行名称。

\n

您可能需要考虑完全丢弃行名称,或者将它们作为列放入框架中(正如我在rownames_to-column上面所做的那样,可以在基本 R 中使用 轻松完成data$rowname <- rownames(data))。

\n