我有一个成对比较的矩阵,其上三角和对角线设置为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变量?
答案 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)
虽然您已经有了其他答案,但是如果调用了适当的功能,则可以使用reshape2
和melt
来实现 。在这种情况下,您不希望应用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