融合具有逻辑值的矩阵

时间:2019-07-01 11:07:07

标签: r reshape2

我有一个成对比较的矩阵,其上三角和对角线设置为NA

df <- data.frame(a=c(NA,1,2), b=c(NA,NA,3), c=c(NA,NA,NA))
row.names(df) <- names(df)

I want to transform the matrix to long format, for which the standard procedure is to use reshape2's melt,后跟na.omit,所以我想要的输出是:

Var1 Var2 Value
a     b   1
a     c   2
b     c   3

但是,df$c完全不适用,因此是逻辑上的,melt将用作不可测量的变量。 因此,melt(df)的输出不是我想要的。

library(reshape2)
melt(df)

如何防止融化将df$c用作id变量?

3 个答案:

答案 0 :(得分:4)

技巧是将行名转换为列,然后转换为长格式。在tidyverse中做到这一点的一种方法是

library(tidyverse)

df %>% 
  rownames_to_column() %>% 
  gather(var, val, -1) %>% 
  filter(!is.na(val))


#  rowname var val
#1       b   a   1
#2       c   a   2
#3       c   b   3

正如@Humpelstielzche在评论中提到的那样,在collect中有一个na.rm参数,因此我们可以省略最后一个过滤,即

df %>% 
 rownames_to_column() %>% 
 gather(var, val, -1, na.rm = TRUE)

答案 1 :(得分:1)

在基数R中,我们可以使用import time class DelayCallback(keras.callbacks.Callback): def __init__(self,delay_value=10, epoch_to_complete=10): self.delay_value = delay_value # in second self.epoch_to_complete = epoch_to_complete def on_epoch_begin(self, epoch, logs={}): if (epoch+1) % self.epoch_to_complete == 0: print("cooling down") time.sleep(self.delay_value) return model.fit(x_train, y_train, batch_size=32, epochs=20, verbose=1, callbacks=[DelayCallback()]) row分别获取行名和列名,然后过滤col值。

NA

答案 2 :(得分:1)

虽然您已经有了其他答案,但是如果调用了适当的功能,则可以使用reshape2melt来实现 。在这种情况下,您不希望应用reshape2:::melt.data.frame,而是希望应用reshape2:::melt.matrix。因此,尝试:

melt(as.matrix(df), na.rm=TRUE)
#  Var1 Var2 value
#2    b    a     1
#3    c    a     2
#6    c    b     3

如果您随后查看?reshape2:::melt.data.frame,则会看到以下语句:

  

此代码在概念上类似于“ as.data.frame.table”

这意味着您还可以使用更复杂的东西:

na.omit(as.data.frame.table(as.matrix(df), responseName="value"))
#  Var1 Var2 value
#2    b    a     1
#3    c    a     2
#6    c    b     3