r 中的 reshape::melt 不断出现警告消息

ber*_*iin 3 warnings r reshape dataframe melt

我不断收到如下警告消息:

as.is should be specified by the caller using true 
Run Code Online (Sandbox Code Playgroud)

代码如下:

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)
Run Code Online (Sandbox Code Playgroud)

描述 :

我想计算数据帧的colmeans并将它们分成两个不同的列。我删除了“X2”,因为最后我想用 ggplot 绘制它们。(结果与值和值的id相结合)

akr*_*run 5

问题出在代码行中reshape::melt

dn[char] <- lapply(dn[char], type.convert)
Run Code Online (Sandbox Code Playgroud)

应该type.convertas.is = TRUE

在下一步中它会显示警告

indices <- do.call(expand.grid, dn)
Run Code Online (Sandbox Code Playgroud)

警告消息:在 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)
}
Run Code Online (Sandbox Code Playgroud)

并尝试重现该问题mtcars

data(mtcars)
difficulty_data <- mtcars %>%
         colMeans() %>%
         t() %>%
         as.data.frame %>% 
        t() 
Run Code Online (Sandbox Code Playgroud)

数据是一个具有一列和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
Run Code Online (Sandbox Code Playgroud)

如上所述,修复方法是添加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
Run Code Online (Sandbox Code Playgroud)

修复后没有警告


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

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

现在,测试一下

> 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
Run Code Online (Sandbox Code Playgroud)

无警告

  • 由于这是一个通用警告,我可以扩展上面的答案:此警告可能来自依赖于 reshape Melt 的任何其他函数。您可能会使用“splitstackshape”包中的“cSplit()”得到相同的警告 (3认同)
  • 是的,当然.. 所以你的答案是@akrun 顺便说一句,如果我们搜索警告“type.convert”和“as.is = TRUE”,我们会以某种方式在谷歌上找到这里。因此,如果其他人像我一样在这里绊倒,我想提一个小评论。 (3认同)
  • 感谢您的努力和时间。哇,这真的很有帮助 (2认同)