Подтвердить что ты не робот

Предупреждение о переполнении

Я использую melt и сталкиваюсь со следующим предупреждающим сообщением:
attributes are not identical across measure variables; they will be dropped

Оглядываясь, люди упомянули об этом, потому что переменные - разные классы; однако это не относится к моему набору данных.

Вот набор данных:

test <- structure(list(park = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L), .Label = c("miss", "piro", "sacn", "slbe"), class = "factor"), 
    a1.one = structure(c(3L, 1L, 3L, 3L, 3L, 3L, 1L, 3L, 3L, 
    3L), .Label = c("agriculture", "beaver", "development", "flooding", 
    "forest_pathogen", "harvest_00_20", "harvest_30_60", "harvest_70_90", 
    "none"), class = "factor"), a2.one = structure(c(6L, 6L, 
    6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L), .Label = c("development", 
    "forest_pathogen", "harvest_00_20", "harvest_30_60", "harvest_70_90", 
    "none"), class = "factor"), a3.one = structure(c(3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("forest_pathogen", 
    "harvest_00_20", "none"), class = "factor"), a1.two = structure(c(3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("agriculture", 
    "beaver", "development", "flooding", "forest_pathogen", "harvest_00_20", 
    "harvest_30_60", "harvest_70_90", "none"), class = "factor"), 
    a2.two = structure(c(6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
    6L), .Label = c("development", "forest_pathogen", "harvest_00_20", 
    "harvest_30_60", "harvest_70_90", "none"), class = "factor"), 
    a3.two = structure(c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L), .Label = c("forest_pathogen", "harvest_00_20", "none"
    ), class = "factor")), .Names = c("park", "a1.one", "a2.one", 
"a3.one", "a1.two", "a2.two", "a3.two"), row.names = c(NA, 10L
), class = "data.frame")

И вот структура:

str(test)
'data.frame':   10 obs. of  7 variables:
 $ park  : Factor w/ 4 levels "miss","piro",..: 1 1 1 1 1 1 1 1 1 1
 $ a1.one: Factor w/ 9 levels "agriculture",..: 3 1 3 3 3 3 1 3 3 3
 $ a2.one: Factor w/ 6 levels "development",..: 6 6 6 6 6 6 6 6 6 6
 $ a3.one: Factor w/ 3 levels "forest_pathogen",..: 3 3 3 3 3 3 3 3 3 3
 $ a1.two: Factor w/ 9 levels "agriculture",..: 3 3 3 3 3 3 3 3 3 3
 $ a2.two: Factor w/ 6 levels "development",..: 6 6 6 6 6 6 6 6 6 6
 $ a3.two: Factor w/ 3 levels "forest_pathogen",..: 3 3 3 3 3 3 3 3 3 3

Это потому, что количество уровней различно для каждой переменной? Итак, могу ли я просто игнорировать предупреждающее сообщение в этом случае?

Чтобы создать предупреждающее сообщение:

library(reshape2)
test.m <- melt (test,id.vars=c('park'))
Warning message:
attributes are not identical across measure variables; they will be dropped

Спасибо.

4b9b3361

Ответ 1

Объяснение:

Когда вы расплавляетесь, вы объединяете несколько столбцов в один. В этом случае вы объединяете столбцы факторов, каждый из которых имеет атрибут levels. Эти уровни не одинаковы для столбцов, потому что ваши факторы на самом деле разные. melt просто приводит ко всем символам символ и отбрасывает их атрибуты при создании столбца value в результате.

В этом случае предупреждение не имеет значения, но вам нужно быть очень осторожным при объединении столбцов, которые не имеют один и тот же "тип", где "тип" не означает только векторный тип, но в целом характер вещей это относится к. Например, я бы не захотел расплавить колонку, содержащую скорости в MPH, с одним, содержащим веса в LB.

Один из способов подтвердить, что вы можете комбинировать столбцы факторов, - это спросить себя, может ли любое возможное значение в одном столбце быть разумным значением в каждом столбце. Если это так, то, скорее всего, правильная вещь должна состоять в том, чтобы гарантировать, что каждый столбец факторов имеет все возможные уровни, которые он мог бы принять (в том же порядке). Если вы это сделаете, вы не получите предупреждение, когда расплавляете таблицу.

Иллюстрация:

library(reshape2)
DF <- data.frame(id=1:3, x=letters[1:3], y=rev(letters)[1:3])
str(DF)

Уровни для x и y не совпадают:

'data.frame':  3 obs. of  3 variables:
$ id: int  1 2 3
$ x : Factor w/ 3 levels "a","b","c": 1 2 3
$ y : Factor w/ 3 levels "x","y","z": 3 2 1

Здесь мы melt и посмотрим на столбец x и y были расплавлены в (value):

melt(DF, id.vars="id")$value

Мы получаем символ символа и предупреждение:

[1] "a" "b" "c" "z" "y" "x"
Warning message:
attributes are not identical across measure variables; they will be dropped 

Если, однако, reset факторы имеют одинаковые уровни и только тогда расплавляются:

DF[2:3] <- lapply(DF[2:3], factor, levels=letters)
melt(DF, id.vars="id", factorsAsStrings=F)$value

Мы получаем правильный коэффициент и никаких предупреждений:

[1] a b c z y x
Levels: a b c d e f g h i j k l m n o p q r s t u v w x y z

Поведение melt по умолчанию - это понизить уровни факторов, даже если они идентичны, поэтому мы используем factorsAsStrings=F выше. Если вы не использовали этот параметр, вы получили бы вектор символов, но не предупредили. Я бы сказал, что поведение по умолчанию должно состоять в том, чтобы сохранить результат как фактор, но здесь это не так.

Ответ 2

Ответ BrodieG превосходный; однако есть некоторые случаи, когда нецелесообразно реорганизовывать столбцы (например, климатические данные GHCN с 128 столбцами фиксированной ширины, которые я хотел расплавить в гораздо меньшее количество столбцов).

В этом случае самым простым решением является обработка данных как символов, а не факторов: например, вы можете повторно импортировать данные с помощью read.fwf(filename,stringsAsFactors=FALSE) (та же идея будет работать для read.csv). Для меньшего количества столбцов вы можете преобразовать коэффициенты в строки с помощью d$mystring<-as.character(d$myfactor).