在R中操作data.frame()对象

时间:2015-08-20 07:48:26

标签: r

我有一个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列对每个模块的元素进行排序。任何人都可以帮我做这件事吗?

由于

2 个答案:

答案 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))