我有一个像
这样的数据框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“中的 意外符号
我在哪里做错了?
答案 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"))