R-使用列上的计算折叠数据帧的行

R-使用列上的计算折叠数据帧的行,r,dataframe,R,Dataframe,我有一个看起来像这样的数据框 sampleDF <- data.frame(entrezgene_id = c(rep(1, 20), rep(10, 25), rep(100, 5)), ensembl_gene_id = c(rep("a", 7), rep("b", 8), rep("c", 7), rep("d", 8), rep("e", 15),

我有一个看起来像这样的数据框

sampleDF <- data.frame(entrezgene_id = c(rep(1, 20), rep(10, 25), rep(100, 5)),
                       ensembl_gene_id = c(rep("a", 7), rep("b", 8), rep("c", 7),
                                           rep("d", 8), rep("e", 15),
                                           rep("f", 2), rep("g", 2), rep("h", 1)),
                       transcript_length = sample(500:10000, 50))
entrezgene_id   ensembl_gene_id medianTranscriptLength
            1                 a                   5795
            1                 b                   4981
            1                 c                   6526
           10                 c                   2307
           10                 d                   5044
           10                 e                   6069
          100                 f                   8669
          100                 g                 6570.5
          100                 h                   6997
其中,它迭代第一列中的每个项目,对于第二列中的每个项目,计算第三列中相应值的中值。 我现在的做法是创建另一个数据帧,其中第二列是键。但是,由于第二列中的重复项与第一列的多个条目重叠(例如,在我的示例中,请参见ensembl_gene_id“c”),因此我必须创建另一个数据帧,在该数据帧中,我展平了entrezgene_id列。我相信一定有一种更短的方法可以做到这一点。这似乎很简单,但我不知道怎么做。我非常感谢你的帮助


谢谢

我们可以使用
聚合
来自
基本R

aggregate(transcript_length ~ ., sampleDF, median)

我们可以从
base R

aggregate(transcript_length ~ ., sampleDF, median)

另一方面,考虑使用<代码> TpEp< /COD>:

tapply(sampleDF$transcript_length, list(sampleDF$entrezgene_id, sampleDF$ensembl_gene_id), median)
       a    b      c      d    e      f      g    h
1   7059 3972 2709.0     NA   NA     NA     NA   NA
10    NA   NA 5826.5 3573.5 6797     NA     NA   NA
100   NA   NA     NA     NA   NA 2749.5 3335.5 6291

结果以更加简洁的方式显示。

< P>可选地,考虑使用<代码> TpEp< /COD>:

tapply(sampleDF$transcript_length, list(sampleDF$entrezgene_id, sampleDF$ensembl_gene_id), median)
       a    b      c      d    e      f      g    h
1   7059 3972 2709.0     NA   NA     NA     NA   NA
10    NA   NA 5826.5 3573.5 6797     NA     NA   NA
100   NA   NA     NA     NA   NA 2749.5 3335.5 6291

结果将以更加简洁的方式显示。

谢谢。这正是我需要的。如果你不介意的话,再问一个问题。例如,如果我想编写一些自定义函数,而不是中值函数,我该怎么做?@ZuhaibAhmed您可以动态创建匿名函数(lamba函数),即
aggregate(transcript_length~,sampleDF,FUN=function(x)median(x,na.rm=TRUE))
它也可以是一个自定义函数
FUN=f1
我假设输入函数的只是“transcript_length”中与第2列中的值相对应的值?@ZuhaibAhmed这里的
x
是来自
~
的lhs的列的值,即transcript_length'。
表示用于分组的所有其他列。如果您有100列,并且只想使用2或3进行分组,那么请使用
+
在公式中指定这些列,非常感谢您的帮助!非常感谢。这正是我需要的。如果你不介意的话,再问一个问题。例如,如果我想编写一些自定义函数,而不是中值函数,我该怎么做?@ZuhaibAhmed您可以动态创建匿名函数(lamba函数),即
aggregate(transcript_length~,sampleDF,FUN=function(x)median(x,na.rm=TRUE))
它也可以是一个自定义函数
FUN=f1
我假设输入函数的只是“transcript_length”中与第2列中的值相对应的值?@ZuhaibAhmed这里的
x
是来自
~
的lhs的列的值,即transcript_length'。
表示用于分组的所有其他列。如果您有100列,并且只想使用2或3进行分组,那么请使用
+
在公式中指定这些列,非常感谢您的帮助!我不知道塔普利的事。谢谢你提醒我。这肯定很有用,但就我目前的目的而言,我希望它采用我上面提到的形式。结果证明聚合函数正是我想要的。我不知道tapply。谢谢你提醒我。这肯定很有用,但就我目前的目的而言,我希望它采用我上面提到的形式。结果证明聚合函数正是我想要的。