按不同因素排序数据框

时间:2015-04-15 15:02:38

标签: r

您好我有这样的数据框:

x <- data.frame("Group"= c(rep(letters[1],2),rep(letters[2],2),rep(letters[3],2),rep(letters[4],2),letters[5]) , "Treatment"=   c(rep(c("ATR","Co"),4),"Gen"), "Mean" = 1:9)

想要我想做的就是以自定义方式订购,即将“Gen”Treatment的行移到第一行。我可以找到类似的东西:

if( "Genetic Control", idGroup$Treatment)
match("Genetic Control",idGroup$Treatment)
if(grepl("Gen",x$Treatment...

但是我找不到任何将上面一行移到第一行的函数。 一旦我管理了这个,我想通过每个组的两个组件的x $ mean的平均值来排序其余的数据。例如,在这种情况下,“d”的两个分量的平均值是7.5,因此在“Gen”处理之后它将进入以下行。在此示例中,数据框应如下所示:

  x <- data.frame("Group"= c(letters[5], rep(letters[4],2),rep(letters[3],2),rep(letters[2],2),rep(letters[1],2)), "Treatment"=   c("Gen", rep(c("ATR","Co"),4)), "Mean" = 9:1)

2 个答案:

答案 0 :(得分:1)

以下是使用R包sqldf的更新答案(点击链接进行简要介绍)。

library(sqldf)

x <- data.frame(
        "Group"= c(rep(letters[1],2),rep(letters[2],2),rep(letters[3],2),rep(letters[4],2),letters[5]), 
        "Treatment"=   c(rep(c("ATR","Co"),4),"Gen"), 
        "Mean" = 1:9)

首先,您可以使用此语句获取每个组的列Mean的平均值(类似于R中的aggregate):

sqldf("
SELECT 
    `Group` AS `Group`, 
    AVG(`Mean`) AS `GroupMean` 
FROM x 
GROUP BY `Group`;")

  Group GroupMean
1     a       1.5
2     b       3.5
3     c       5.5
4     d       7.5
5     e       9.0

然后,使用JOIN语句(如R中的merge)将此表格与原始表格相关联,将“{&#39; Gen&#39;在顶部,然后按GroupMean排序。我将这些表称为t1t2,将它们连接在一起,然后从中选择我想要的列,并对表进行排序。我已经格式化了查询,所以希望它更容易理解。阅读MySQLsqldf上的几篇文章会有所帮助。另外,根据@G的评论。 Grothendieck,您可以使用`来封闭列名和&#39;包含字符串。希望这会有所帮助。

sqldf("
SELECT 
    t1.`Group` AS `Group`, 
    t1.`Treatment` AS `Treatment`, 
    t1.`Mean` AS `Mean`, 
    t2.`GroupMean` AS `GroupMean` 
FROM
    (SELECT * FROM x) t1
    JOIN
    (SELECT 
        `Group` AS `Group`, 
        AVG(`Mean`) AS `GroupMean` 
    FROM x 
    GROUP BY `Group`) t2
    ON t1.`Group` = t2.`Group`
ORDER BY CASE `Treatment` WHEN 'Gen' THEN 1 ELSE 2 END, 
    `GroupMean` DESC, 
    `Mean` DESC;
")

  Group Treatment Mean GroupMean
1     e       Gen    9       9.0
2     d        Co    8       7.5
3     d       ATR    7       7.5
4     c        Co    6       5.5
5     c       ATR    5       5.5
6     b        Co    4       3.5
7     b       ATR    3       3.5
8     a        Co    2       1.5
9     a       ATR    1       1.5

答案 1 :(得分:0)

试试这个

x$Treatment <- ordered(x$Treatment, levels = c("Gen", "ATR", "Co")) 
x <- x[order(x$Treatment), ]

按照您想要的顺序定义levels 使用unique(x$Treatment)查看您的治疗方法。

对于你问题的第二部分,我不确定我理解。试试这个,让我知道它是否有效:

library(dplyr)

x$rank <- (x$Treatment!="Gen")*1
x <- x %>% group_by(Group) %>% mutate(temp=mean(Mean)) %>% 
      ungroup %>% arrange(rank, -temp) %>% select(-rank, -temp)