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

在R中操作data.frame()对象,r,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 library(dplyr) library(tidyr) mydf %>% g

我有一个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
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
我想根据每个元素的模块名称将此矩阵缩减为以下矩阵:

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列按降序对每个模块的元素进行排序。有谁能帮我做这件事吗


谢谢

如果您的数据格式为“长”格式,这将是一项更容易解决的工作

因此,您可以尝试以下方法:

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
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

如果您想按组而不是总体排序,请在其中的某个位置添加一个
groupby

如果您的数据格式为“长”格式,这将是一项更容易解决的工作

因此,您可以尝试以下方法:

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
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

如果您想按组而不是总体排序,请在其中的某个位置添加一个
groupby

一种可能的基本
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))

一种可能的基本
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))

当我尝试此解决方案时,它失败了,因为
name
module
列是影响因素。当我将这些列转换为字符时,它就起作用了。我添加了数据以备不时之需。OP没有提到这一点,但确实需要进行预处理。我还把它改成了base
R
stru detect
太过分了。非常感谢,如何根据m.module列中的值对模块元素进行排序?如果我在我的数据框中前面的每一列之后再添加三列p.m.red、p.m.blue和p.m.green,我想在结果中添加另一列p.m.module,我怎么做?对不起,这是一个不同的问题,需要澄清。您可以为此打开另一个主题,但首先尝试一些实验/解决方案。顺便问一下,原来的问题是这样回答的,请考虑接受适合你的答案来结束这个话题!当我尝试此解决方案时,它失败了,因为
name
module
列是影响因素。当我将这些列转换为字符时,它就起作用了。我添加了数据以备不时之需。OP没有提到这一点,但确实需要进行预处理。我还把它改成了base
R
stru detect
太过分了。非常感谢,如何根据m.module列中的值对模块元素进行排序?如果我在我的数据框中前面的每一列之后再添加三列p.m.red、p.m.blue和p.m.green,我想在结果中添加另一列p.m.module,我怎么做?对不起,这是一个不同的问题,需要澄清。您可以为此打开另一个主题,但首先尝试一些实验/解决方案。顺便问一下,原来的问题是这样回答的,请考虑接受适合你的答案来结束这个话题!我想知道你是否可以跳过
separate
步骤,只做
df%>%聚集(var,val,m.red:m.green)%%过滤器(module==sub(“m\\\”,“”,var))
我想知道你是否可以跳过
separate
步骤,只做
df%>%聚集(var,val,m.red:m.green)%%过滤器(module==sub(“m\\”,“”,var))