我有一个data.frame,包括以下五列:
name module m.red m.blue m.green
z red 0.22 0.1 0.09
g red 0.98 0.3 0.4
d green 0.08 0.2 0.87
k blue 0.2 0.88 0.4
b blue 0.1 0.9 0.3
我想根据每个元素的模块名称将此矩阵缩减为以下矩阵:
name module m.module
z red 0.22
g red 0.98
d green 0.87
k blue 0.88
b blue 0.9
然后按递减顺序基于m.module列对每个模块的元素进行排序。任何人都可以帮我做这件事吗?
由于
答案 0 :(得分:3)
如果您的数据采用“长”格式,这将是一个更容易解决的工作。
因此,您可以尝试以下方法:
library(dplyr)
library(tidyr)
mydf %>%
gather(var, val, m.red, m.blue, m.green) %>% ## Make the data long
separate(var, into = c("m", "var")) %>% ## Make it easy to match things
filter(module == var) %>% ## Use the matching to filter
select(name, module, val) %>% ## Keep just the columns you want
arrange(val) ## Sort
# name module val
# 1 z red 0.22
# 2 d green 0.87
# 3 k blue 0.88
# 4 b blue 0.90
# 5 g red 0.98
如果您想按组而不是整体排序,请在其中的某处添加group_by
。
答案 1 :(得分:2)
可能的基础R
方法:
cols = tail(names(df),3)
mask = sapply(df$module, function(x) grepl(x, cols))
dt = transform(df[,1:2], m.module=t(df[,cols])[mask])
dt[order(dt$m.module, decreasing=T),]
# name module m.module
#2 g red 0.98
#4 k blue 0.90
#3 d blue 0.88
#5 b green 0.87
#1 z red 0.22
数据:强>
df = structure(list(name = c("z", "g", "d", "k", "b"), module = c("red",
"red", "green", "blue", "blue"), m.red = c(0.22, 0.98, 0.08,
0.2, 0.1), m.blue = c(0.1, 0.3, 0.2, 0.88, 0.9), m.green = c(0.09,
0.4, 0.87, 0.4, 0.3)), .Names = c("name", "module", "m.red",
"m.blue", "m.green"), class = "data.frame", row.names = c(NA,
-5L))