基于相同列名或R中单独df的聚合/总和/计数值

基于相同列名或R中单独df的聚合/总和/计数值,r,sum,aggregate,R,Sum,Aggregate,我一直在尝试几种不同的方法(聚合、colSum、理货等),但我很挣扎 我有一个样本结果的大数据集(100列,1000000行),其中我用它们所属类别的名称替换了单个样本名称。(我需要按类别统计每个数据点的总数 Sequence position cat1 cat1 cat2 cat2 cat2 cat3 cat3 abfsgdfy a 0 1 0 1 0 1 1 abfsgdfy b 0

我一直在尝试几种不同的方法(聚合、colSum、理货等),但我很挣扎

我有一个样本结果的大数据集(100列,1000000行),其中我用它们所属类别的名称替换了单个样本名称。(我需要按类别统计每个数据点的总数

Sequence   position  cat1  cat1  cat2  cat2  cat2  cat3  cat3
abfsgdfy   a         0     1     0     1     0     1     1
abfsgdfy   b         0     0     1     1     1     1     0
dgdtecgd   b         1     1     1     0     0     0     0
我知道不希望有相同的列名,所以我一直在尝试转置数据,然后使用它。但这也没有让我走多远

我希望得到的结果大致如下:

Sequence  position  cat1  cat2  cat3
abfsgdfy   a        1     1     2 
abfsgdfy   b        0     3     1
dgdtecgd   b        2     1     0
如果有帮助,我有一个表可以将示例名称转换为更大的类别组:

Type    Name
cat1    sample1
cat1    sample2
cat2    sample3
cat2    sample4
cat2    sample5
cat3    sample6
cat3    sample7
谢谢你的帮助!

这个怎么样

library("tidyverse")
df = tibble(c("abfsgdfy", "abfsgdfy", "dgdtecgd"),
                c("a", "b", "b"),
                c(0, 0, 1),
                c(1, 0, 1),
                c(0, 1, 1),
                c(1, 1, 0),
                c(0, 1, 0))
colnames(df) = c("Sequence", "position", "cat1", "cat1", "cat2", "cat2", "cat2")

# rename column names to make them unique:
newcols = c("Sequence", "position", paste0("c", 1:(ncol(df)-2)))
oldcols = colnames(df)
colnames(df) = newcols

# make a crosswalk
col_cross = tibble(oldcols = oldcols,
                   newcols = newcols)

# gather the new columns, summarize across the old columns, spread
df %>% 
  gather(key = "newcols", value = "val", -Sequence, -position) %>% 
  left_join(col_cross) %>% 
  group_by(Sequence, position, oldcols) %>% 
  summarize(n = sum(val)) %>% 
  spread(key = oldcols, value = n, fill = 0)

不同的
tidyverse
可能性:

repair_names(df, prefix = "cat", sep = "_") %>% 
 rowid_to_column() %>%
 gather(var, val, -c(Sequence, position, rowid)) %>%
 mutate(temp = sub("\\_.*", "", var)) %>%
 arrange(rowid) %>%
 group_by(Sequence, position, temp) %>%
 summarise(res = sum(val),
           rowid = first(rowid)) %>%
 spread(temp, res) %>%
 select(-rowid)

  Sequence position  cat1  cat2
  <chr>    <chr>    <dbl> <dbl>
1 abfsgdfy a           1.    1.
2 abfsgdfy b           0.    3.
3 dgdtecgd b           2.    1.

您的脚本按原样工作,但当将其放在我自己的数据上时,它会返回原始表,但类别名称更改为示例名称,更改为c1、c2、c3等。嗯,这对我来说并不是足够的信息,无法提供进一步的帮助。col_交叉数据集与您的数据是否匹配?是否有来自dplyr的消息语句?很抱歉,一次做的事情太多了。我相信这是因为我的数据已经有了列名,但您正在引用colnames(df)来保存旧的命名结构。我没有固定的列名结构,因为它会根据我正在查看的文件而变化。(我经常在偶然事件中发布-不太熟悉在这里发布。)我正在尝试以下方法:oldcols=colnames(df)newcols=c(“轨迹”,“链”,paste0(“c”,1:(ncol(df)-2)))colnames(df)=newcols运行大约需要10分钟,好的,我很确定我的方法会起作用。你可能想坐下来,用一个新的R会话慢慢地完成它。确保你将我方法中的对象名称更改为你加载到as中的任何对象。最后我也没有提供赋值语句。好的luckIt工作得很好!比如你说,我没有赋值语句,所以它输出的是垃圾。添加了一个赋值,它生成了我需要的表格。谢谢!!对泛型表示抱歉,我实际上没有使用cat1、cat2等。它可以是正方形、乌龟形、球形、蓝色、55等。但是我可以制作一个翻译文件,为它们指定泛型cat1、cat2等,并对其进行测试。(我很可能明天会试试。)然后你可以用
修复名称(df,sep=“”)
)替换第一行。这也很有效!谢谢!我必须计算这两个解决方案的时间,看看它们之间的比较。运行Sven的代码需要3.94分钟,运行你的代码需要4.63分钟。
df <- tibble(c("abfsgdfy", "abfsgdfy", "dgdtecgd"),
            c("a", "b", "b"),
            c(0, 0, 1),
            c(1, 0, 1),
            c(0, 1, 1),
            c(1, 1, 0),
            c(0, 1, 0))
colnames(df) <- c("Sequence", "position", "cat1", "cat1", "cat2", "cat2", "cat2")