是什么导致tidyr警告消息:“属性在度量变量之间不相同”

时间:2017-08-22 15:02:34

标签: r tidyr tidyverse

我有tibbledf

> df
# A tibble: 4 x 5
    profile Sepal.Length Sepal.Width Petal.Length Petal.Width
      <chr>        <dbl>       <dbl>        <dbl>       <dbl>
1 Profile 1       -1.011       0.850       -1.301      -1.251
2 Profile 2        0.542      -0.389        0.662       0.673
3 Profile 3       -0.376      -0.967        0.115       0.038
4 Profile 4        1.502       0.158        1.277       1.239

当我使用`tidyr :: gather()时,如下:

tidyr::gather(df, var, val, -profile)

返回以下错误:

Warning message: attributes are not identical across measure variables; they will be dropped 

我做了一些搜索(并检查df是否有可能导致问题的任何属性),但无法理解为什么要打印此警告。

df <- structure(list(profile = c("Profile 1", "Profile 2", "Profile 3", 
"Profile 4"), Sepal.Length = structure(c(-1.011, 0.542, -0.376, 
1.502), .Dim = c(150L, 1L), "`scaled:center`" = 5.84333333333333, "`scaled:scale`" = 0.828066127977863), 
    Sepal.Width = structure(c(0.85, -0.389, -0.967, 0.158), .Dim = c(150L, 
    1L), "`scaled:center`" = 3.05733333333333, "`scaled:scale`" = 0.435866284936698), 
    Petal.Length = structure(c(-1.301, 0.662, 0.115, 1.277), .Dim = c(150L, 
    1L), "`scaled:center`" = 3.758, "`scaled:scale`" = 1.76529823325947), 
    Petal.Width = structure(c(-1.251, 0.673, 0.038, 1.239), .Dim = c(150L, 
    1L), "`scaled:center`" = 1.19933333333333, "`scaled:scale`" = 0.762237668960347)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -4L), .Names = c("profile", 
"Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width"))

编辑:

当我打印df时,它看起来很好:

> df
# A tibble: 2 x 5
    profile Sepal.Length Sepal.Width Petal.Length Petal.Width
      <chr>        <dbl>       <dbl>        <dbl>       <dbl>
1 Profile 1       -1.011       0.850       -1.301      -1.251
2 Profile 2        0.506      -0.425        0.650       0.625

但是,当我运行dput(df),然后运行它输出的代码(与上面相同的代码)时,将返回@neilfws标识的错误。

1 个答案:

答案 0 :(得分:1)

我最近遇到了这个问题,并且有一些想法可以补充,这可能对将来为其他人提供参考

同意@neilfws,其中一个属性错误是由于列属性中包含.Dim = c(150, 1L)导致的-引用了iris数据的150行,但是此子集只有4行数据。 / p>

但是,返回的警告(也在帖子标题中):

警告消息:跨度量的属性不相同 变量他们将被丢弃

指的是将data.frame列与gather合并时删除的属性,因为它们并不完全相同。这篇文章中的df确实具有从scaled开始出现的属性:

R> str(df)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   4 obs. of  5 variables:
 $ profile     : chr  "Profile 1" "Profile 2" "Profile 3" "Profile 4"
 $ Sepal.Length: num [1:4, 1] -1.011 0.542 -0.376 1.502
  ..- attr(*, "`scaled:center`")= num 5.84
  ..- attr(*, "`scaled:scale`")= num 0.828
 $ Sepal.Width : num [1:4, 1] 0.85 -0.389 -0.967 0.158
  ..- attr(*, "`scaled:center`")= num 3.06
  ..- attr(*, "`scaled:scale`")= num 0.436
 $ Petal.Length: num [1:4, 1] -1.301 0.662 0.115 1.277
  ..- attr(*, "`scaled:center`")= num 3.76
  ..- attr(*, "`scaled:scale`")= num 1.77
 $ Petal.Width : num [1:4, 1] -1.251 0.673 0.038 1.239
  ..- attr(*, "`scaled:center`")= num 1.2
  ..- attr(*, "`scaled:scale`")= num 0.762

但这只是一个警告-它仍然可以工作,但是您丢失了attr信息,因为它们在组合时会因变量而异。

如果您有类似的data.frame而没有这些attr-例如:

structure(list(profile = structure(1:4, .Label = c("Profile 1", 
"Profile 2", "Profile 3", "Profile 4"), class = "factor"), Sepal.Length = c(-1.011, 
0.542, -0.376, 1.502), Sepal.Width = c(0.85, -0.389, -0.967, 
0.158), Petal.Length = c(-1.301, 0.662, 0.115, 1.277), Petal.Width = c(-1.251, 
0.673, 0.038, 1.239)), class = "data.frame", row.names = c(NA, 
-4L))

然后gather将在没有任何警告的情况下工作。

此外,自最新tidyr起,建议使用pivot_longer代替gather,因为将不维护gather

library(tidyr)

pivot_longer(df, cols = -profile, names_to = "var", values_to = "val")