您好我有这样的数据框:
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)
答案 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
排序。我将这些表称为t1
和t2
,将它们连接在一起,然后从中选择我想要的列,并对表进行排序。我已经格式化了查询,所以希望它更容易理解。阅读MySQL
或sqldf
上的几篇文章会有所帮助。另外,根据@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)