在R中使用reshape::melt时不断出现警告信息

3

我经常收到类似以下的警告信息:

as.is should be specified by the caller using true 

代码就像:

difficulty_data <- data_original[,c(-1)] %>% colMeans() %>% t() %>% as.data.frame() %>% t() 
difficulty_data <- reshape::melt(difficulty_data, id.vars=c("id"))  %>% dplyr::select(-X2)

描述:

我想计算数据框的列均值,并将它们分成两个不同的列。我删除了“X2”,因为最终我想用ggplot将它们绘制出来。(结果是将值和值的ID组合在一起)


3
请使用dput提供一个小的可复现的例子。相较于reshape(其中也包括melt)或者data.tablereshape2是一个比较老的包。另外还有tidyr,其中包含pivot_longer函数。建议使用pivot_longer - akrun
2
这似乎是由于对 type.convert 进行更改而引起的警告,例如 type.convert('1'),因此是由您使用的函数调用的某些内容而不是您显式调用的。 - rawr
3个回答

5
问题出现在reshape::melt中的代码行。
dn[char] <- lapply(dn[char], type.convert)

应该使用 type.convert 并加上 as.is = TRUE

因为下一步会显示警告信息

indices <- do.call(expand.grid, dn)

警告信息: 在type.convert.default(X[[i]], ...)中: 调用者应该指定'as.is'参数;现在使用TRUE。

也就是说,如果我们查看源代码

 getAnywhere("melt.matrix")[1]
function (data, varnames = names(dimnames(data)), ...) 
{
    values <- as.vector(data)
    dn <- dimnames(data)
    if (is.null(dn)) 
        dn <- vector("list", length(dim(data)))
    dn_missing <- sapply(dn, is.null)
    dn[dn_missing] <- lapply(dim(data), function(x) 1:x)[dn_missing]
    char <- sapply(dn, is.character)
    dn[char] <- lapply(dn[char], type.convert)
    indices <- do.call(expand.grid, dn)
    names(indices) <- varnames
    data.frame(indices, value = values)
}

尝试使用mtcars数据重现问题。

data(mtcars)
difficulty_data <- mtcars %>%
         colMeans() %>%
         t() %>%
         as.data.frame %>% 
        t() 

这个数据是一个有一列的矩阵,带有rownames属性

> reshape::melt(difficulty_data)
     X1 X2      value
1   mpg  1  20.090625
2   cyl  1   6.187500
3  disp  1 230.721875
4    hp  1 146.687500
5  drat  1   3.596563
6    wt  1   3.217250
7  qsec  1  17.848750
8    vs  1   0.437500
9    am  1   0.406250
10 gear  1   3.687500
11 carb  1   2.812500
Warning message:
In type.convert.default(X[[i]], ...) :
  'as.is' should be specified by the caller; using TRUE

如上所述,解决方法是添加 type.convert as.is = TRUE
data <- difficulty_data
varnames <- names(dimnames(data))
values <- as.vector(data)
dn <- dimnames(data)
if (is.null(dn)) 
dn <- vector("list", length(dim(data)))
dn_missing <- sapply(dn, is.null)
dn[dn_missing] <- lapply(dim(data), function(x) 1:x)[dn_missing]
      
char <- sapply(dn, is.character)
dn[char] <- lapply(dn[char], type.convert, as.is = TRUE) #change here
indices <- do.call(expand.grid, dn)
names(indices) <- varnames
data.frame(indices, value = values)
          Var1 Var2      value
       1   mpg    1  20.090625
       2   cyl    1   6.187500
       3  disp    1 230.721875
       4    hp    1 146.687500
       5  drat    1   3.596563
       6    wt    1   3.217250
       7  qsec    1  17.848750
       8    vs    1   0.437500
       9    am    1   0.406250
       10 gear    1   3.687500
       11 carb    1   2.812500

修复后没有警告


因此,我们可以创建函数的一个副本并更改特定行

meltnew <- reshape::melt.matrix
body(meltnew)[8][[1]] <- dn[char] <- lapply(dn[char], type.convert, as.is = TRUE)

现在,进行测试

> meltnew(difficulty_data)
     X1 X2      value
1   mpg  1  20.090625
2   cyl  1   6.187500
3  disp  1 230.721875
4    hp  1 146.687500
5  drat  1   3.596563
6    wt  1   3.217250
7  qsec  1  17.848750
8    vs  1   0.437500
9    am  1   0.406250
10 gear  1   3.687500
11 carb  1   2.812500

没有警告


2
感谢您的努力和时间,哇,这真的很有帮助。 - berliiiin
2
由于这是一个通用警告,我可以扩展上面的答案:此警告可能来自依赖于reshape melt的任何其他函数。您可能会在splitstackshape包中的cSplit()中收到相同的警告。 - Lazarus Thurston
@LazarusThurston 是的,但是在这里,OP使用了melt作为步骤中的一部分reshape::melt(difficulty_data, id.vars=c("id")),而我的回答就是基于该代码显示的内容。 - akrun
2
好的,你的回答非常准确 @akrun。 顺便说一下,如果我们搜索警告 type.convertas.is = TRUE,我们会在谷歌上不知怎么地跳到这里。所以我想提一个小建议,如果其他人像我一样偶然来到这里,可以看一下。 - Lazarus Thurston

0
在上述简单情况下,这似乎也可以工作:
#make data
data(mtcars)
difficulty_data <- mtcars %>%
     colMeans() %>%
     t() %>%
     as.data.frame %>% 
    t() 

#melt data
as.data.frame.table(difficulty_data)

0
melt(as.data.frame(difficulty_data))

如果有人遇到相同的问题,尝试一下也可能值得。


这样做可以消除错误,但会丢失行名称。 - JebLuvsStats

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接