子集数据框以获取rowname,colname和value

时间:2015-08-15 12:16:18

标签: r

我有一个像

这样的数据框
Phe  Ile  
Leu  0.10 0.27 
Ile  0.67 0.00 
Val  0.66 0.87 
B.Hy 0.09 0.41

我希望将数据子集大于0.5,因此预期结果为

Phe Ile 0.67
Phe Val 0.66
Ile Val 0.87

我写了一个函数

extract <- function(x){if(x[i,j] > 0.5){print x[1,j]"\t"x[j,1]"\t"x[i,j] }}

但是它给出了错误

  &lt; - function(x){if(x [i,j]&gt; 0.5){print x“

中的

意外符号

我在哪里做错了?

1 个答案:

答案 0 :(得分:2)

我们可以melt数据集从[&#39; wide&#39;格式为&#39; long&#39;转换&#39; data.frame&#39;之后的格式到&#39;矩阵&#39;。这将导致一个“rowname&#39;”,#39; columname&#39;和价值&#39;列,我们可以subset,具有逻辑条件value > 0.5的行。

 library(reshape2)
 subset(melt(as.matrix(df1)), value>0.5)[,c(2:1,3)]
 #  Var2 Var1 value
 #2  Phe  Ile  0.67
 #3  Phe  Val  0.66
 #7  Ile  Val  0.87

注意:在预期的输出中,首先是列名列,然后是行名,然后是值列。通常,它的顺序为rowname/colname/value

base R选项是创建逻辑矩阵(df1> 0.5)。这可以用于对rownames进行子集化。我们可以增加&#39; indx&#39;使用row或&#39; col`&#39; df1&#39;获取对应于&#39; TRUE&#39;的数字行/列位置&lt; indx&#39;中的值虽然&#39; FALSE&#39;将由&#39; 0&#39;取代。基于数字索引,我们过滤了rownames和列名称。

 indx <- df1>0.5
 rn <- rownames(df1)[row(df1)*indx]
 cn <-  colnames(df1)[col(df1)*indx]
 val <- df1[indx]
 data.frame(rn, cn, val)
 #   rn  cn  val
 #1 Ile Phe 0.67
 #2 Val Phe 0.66
 #3 Val Ile 0.87

数据

 df1 <- structure(list(Phe = c(0.1, 0.67, 0.66, 0.09), 
 Ile = c(0.27, 
 0, 0.87, 0.41)), .Names = c("Phe", "Ile"), class = "data.frame", 
 row.names = c("Leu", "Ile", "Val", "B.Hy"))