我有一个数据框
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] }}
但是它给了错误
“提取<-函数(x){if(x [i,j]> 0.5){print x”
我在哪里做错了?
melt
在将“ data.frame”转换为“ matrix”之后,我们可以将数据集从“宽”格式重塑为“长”格式。这将产生一个“行名”,“列名和值”列,我们可以从中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
)。这可用于子集行名。我们可以将row
'indx '与'df1'的'col'相乘,以获得与'indx'中的'TRUE'值相对应的数字行/列位置,而'FALSE'将被替换为'0'。基于数字索引,我们过滤行名和列名。
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"))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句