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