我有tibble
,df
:
> 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标识的错误。
答案 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")