【问题标题】:Find Row averages based on factor in separate dataframe根据单独数据框中的因子查找行平均值
【发布时间】:2020-11-05 04:02:27
【问题描述】:

我有一个大数据框,df1,看起来像这样:

          Gene  CB_1.1 CB_10.1 CB_10.2 CB_10.3
1         Gene1     10       0       0       0
2         Gene2    871       7       9       2
3         Gene3    490       2       5       8
4         Gene4     17       5       6       1
5         Gene5     75       1       1       1
6         Gene6    308       2       6       2

> dput(head(df1[,1:5]))
structure(list(X = c("Gene1", "Gene2", "Gene3", 
"Gene4", "Gene5", "Gene6"), CB_1.1 = c(10L, 
871L, 490L, 17L, 75L, 308L), CB_10.1 = c(0L, 7L, 2L, 5L, 1L, 
2L), CB_10.2 = c(0L, 9L, 5L, 6L, 1L, 6L), CB_10.3 = c(0L, 2L, 
8L, 1L, 1L, 2L)), row.names = c(NA, 6L), class = "data.frame")

还有第二个数据框df2,看起来像这样。

  tissue_subcluster    Class_2
1            CB_1.1     Neuron
2           CB_10.1     Neuron
3           CB_10.2 Non-Neuron
4           CB_10.3 Non-Neuron

> dput(head(df2[,c(7,9)]))
structure(list(tissue_subcluster = c("CB_1.1", "CB_10.1", "CB_10.2", 
"CB_10.3", "CB_11.1", "CB_11.2"), Class_2 = c("Neuron", "Non-Neuron", 
"Non-Neuron", "Non-Neuron", "Non-Neuron", "Non-Neuron")), row.names = c("1", 
"2", "3", "4", "5", "6"), class = "data.frame")

我想根据 df2 中的 NeuronNon-neuron 因子对 df1 中的值进行平均。这样它看起来像这样:

          Gene Neuron_mean Non-Neuron_mean 
1         Gene1         5               0       
2         Gene2       439             5.5       
3         Gene3       246             6.2       
4         Gene4        11             3.5       
5         Gene5        38               1       
6         Gene6       155               4       

我该怎么做?任何帮助表示赞赏!

【问题讨论】:

  • 请使用dput(head(df1)并将结果粘贴到问题中,以便获得可以测试代码的数据。

标签: r dataframe tidyverse


【解决方案1】:

这可能不是处理大型数据集的最佳方法,但您可以使用 tidyrdplyr

df1 %>%
  pivot_longer(cols=-Gene, names_to="tissue_subcluster") %>%
  left_join(df2, by="tissue_subcluster") %>%
  group_by(Gene, Class_2) %>%
  summarise(mean=mean(value)) %>%
  pivot_wider(names_from="Class_2", names_glue="{Class_2}_mean", values_from="mean")

返回

# A tibble: 6 x 3
  Gene          Neuron_mean `Non-Neuron_mean`
  <chr>               <dbl>             <dbl>
1 0610005C13Rik           5               0  
2 0610007P14Rik         439               5.5
3 0610009B22Rik         246               6.5
4 0610009E02Rik          11               3.5
5 0610009L18Rik          38               1  
6 0610009O20Rik         155               4

【讨论】:

    【解决方案2】:

    使用reshape 库,

    library(reshape)
    
    out <- merge(melt(df1),df2, by.x = "variable", by.y = "tissue_subcluster")
    cast(out, Gene~Class_2,mean)
    

    给予,

       Gene Neuron Non-Neuron
    1 Gene1      5        0.0
    2 Gene2    439        5.5
    3 Gene3    246        6.5
    4 Gene4     11        3.5
    5 Gene5     38        1.0
    6 Gene6    155        4.0
    

    【讨论】:

      【解决方案3】:

      这是base R 的选项。将'df1'的列名与'tissue_subcluster'列匹配,得到相应的'Class_2'值,使用它将'df1'拆分为data.frame的list,循环使用list和@987654324 @,并获取rowMeans

      data.frame(Gene = df1$X, sapply(split.default(df1[-1], with(df2, 
         Class_2[match(names(df1)[-1], tissue_subcluster)])), rowMeans))
      #   Gene Neuron Non.Neuron
      #1 Gene1      5        0.0
      #2 Gene2    439        5.5
      #3 Gene3    246        6.5
      #4 Gene4     11        3.5
      #5 Gene5     38        1.0
      #6 Gene6    155        4.0
      

      数据

      df1 <- structure(list(X = c("Gene1", "Gene2", "Gene3", "Gene4", "Gene5", 
      "Gene6"), CB_1.1 = c(10L, 871L, 490L, 17L, 75L, 308L), CB_10.1 = c(0L, 
      7L, 2L, 5L, 1L, 2L), CB_10.2 = c(0L, 9L, 5L, 6L, 1L, 6L), CB_10.3 = c(0L, 
      2L, 8L, 1L, 1L, 2L)), row.names = c(NA, 6L), class = "data.frame")
      
      df2 <- structure(list(tissue_subcluster = c("CB_1.1", "CB_10.1", "CB_10.2", 
      "CB_10.3", "CB_11.1", "CB_11.2"), Class_2 = c("Neuron", "Neuron", 
      "Non-Neuron", "Non-Neuron", "Non-Neuron", "Non-Neuron")), row.names = c("1", 
      "2", "3", "4", "5", "6"), class = "data.frame")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-22
        • 2021-12-22
        • 1970-01-01
        • 2016-03-03
        • 1970-01-01
        • 2021-01-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多