【问题标题】:Apply dplyr functions to several columns of a matrix将 dplyr 函数应用于矩阵的多列
【发布时间】:2015-08-09 07:45:12
【问题描述】:

我有一个 38467*59 的数据框。这是整个数据集的一个子集

mydata.2
   Unique.Groups Protein.group.IDs Intensity.R1 Intensity.R2
1            yes                 0      9701600     17971000
2            yes                 0            0     29308000
3            yes                 1     49083000     75300000
4            yes                 2     53926000     13926000
5            yes                 3     35255000     35750000
6            yes                 3    302600000    295410000
7            yes                 4     72766000     51914000
8            yes                 5     33657000     31027000
9            yes                 5     16504000     20689000
10           yes                 5    191170000    209230000
11           yes                 5    155710000    150280000
12           yes                 5    402890000    529300000
13           yes                 5    633480000    522180000
14           yes                 5     92339000            0
15           yes                 6            0     30646000
16           yes                 6     67494000     92326000
17           yes                 6     20205000            0
18           yes                 7     94183000     76848000
19           yes                 7     15584000            0
20           yes                 7     27247000     38961000
21           yes                 7     98433000    390870000
22           yes                 8            0     36542000
23           yes                 8     83978000            0
24           yes                 8     53744000     95173000
25           yes                 8            0     53494000

我将以下代码应用于 Intensity.R1 列,我想将其自动应用于数据框的所有 Intensities 列。 在每一轮中,我都需要在 Intensity.R1、Intensity.R2 等上运行相同的代码。

     data.normalized <- filter(mydata.2, Unique.Groups == "yes") %>% 
  group_by(Protein.group.IDs) %>%
  arrange(desc(Intensity.R1)) %>% 
  top_n(3, Intensity.R1) %>%
  mutate(sum.top.3.R1 = sum(Intensity.R1)) %>%
  filter(!duplicated(Protein.group.IDs)) %>%
  drop.levels() %>%
  arrange(Protein.group.IDs)

每一轮都应该生成一个新列(即 sum.top.3),我想在决赛桌中将其绑定在一起。 这是 Intensity.R1 列的示例。

data.normalized    
Source: local data frame [9 x 5]
    Groups: Protein.group.IDs

      Unique.Groups Protein.group.IDs Intensity.R1 Intensity.R2 sum.top.3.R1
    1           yes                 0      9701600     17971000      9701600
    2           yes                 1     49083000     75300000     49083000
    3           yes                 2     53926000     13926000     53926000
    4           yes                 3    302600000    295410000    337855000
    5           yes                 4     72766000     51914000     72766000
    6           yes                 5    633480000    522180000   1227540000
    7           yes                 6     67494000     92326000     87699000
    8           yes                 7     98433000    390870000    219863000
    9           yes                 8     83978000            0    137722000

【问题讨论】:

  • 您能否让您的示例可重现,同时提供所需的输出(这将适合提供的数据集完全)?见here。另外,请保持小,因为我们真的不需要38467*59 矩阵来提供解决方案。最后,我建议不要在矩阵上使用dplyrdplyr 设计用于data.frames,如果你有一个大矩阵并且你正在寻找效率,你应该考虑向量化/矩阵操作。
  • 嗨,大卫,感谢您的评论。我实际上犯了一个错误,我的数据是一个 data.frame 对象。我编辑了我的原始帖子,希望它符合您的要求(实际上这是我的第一篇文章..)
  • 您想要的输出是否与提供的示例匹配,或者这两个只是head 调用?另外,请用文字描述您实际想要实现的目标以及已经存在的代码有什么问题
  • 这两个只是头部调用。但是我提供的那段代码正在运行,并给了我我想要的东西。我只是想在我的数据框的几列上重复它并将结果列绑定到同一个表中。换句话说,我想知道 for 循环是否可以在这里工作,或者任何 apply() 函数......
  • 所以您基本上没有按照说明进行操作。我们需要一个完全可重现的示例并完全匹配所需的输出。我们需要对问题的文字描述,然后您的尝试和解释什么不起作用。例如,如果您想创建 50 个额外的列,则可以将其减少到 3 个,然后您应该能够为您的真实数据扩展可能的解决方案。否则,祝你这个问题好运,我希望其他人能帮助你。

标签: r matrix dplyr


【解决方案1】:

我创建了一个具有相同列名的简单示例供您修改。

library(dplyr)
library(gdata)

mydata.2 = data.frame(Unique.Groups = rep("yes",8),
                      Protein.group.IDs = c(1,1,1,1,2,2,2,2),
                      Intensity.R1 = c(10,40,20,30,40,50,70,60),
                      Intensity.R2 = c(70,40,50,60,40,10,20,30))

# function that orders a vector and keeps top 3 values and calculates the sum
ff = function(x) {x[order(-x)][1:3] %>% sum()}


filter(mydata.2, Unique.Groups == "yes") %>% 
  group_by(Protein.group.IDs) %>%
  select(-Unique.Groups) %>% # keep only grouping variable and the ones you need to calculate
  summarise_each(funs(ff))

即使在您的代码中,如果您使用“summarise”而不是“mutate”,您也不必过滤掉重复的 id。 我不知道我是否在这里的 drop.levels 中遗漏了一些东西。 另外,我真的不认为您需要第一个“排列”,因为 top_n 将保留前 3 名,但顺序不正确(这不是问题)。

【讨论】:

  • 这仅返回前 3 名的总和,但您也要求原始列,不是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2013-09-10
  • 2021-09-13
相关资源
最近更新 更多