2014-12-18 3 views
2

У меня есть странная проблема при использовании dplyr на data.frame для вычисления количества отсутствующих наблюдений для каждой группы символьной переменной. Это создает «Ошибка: колонка„“имеет неподдерживаемый типDplyr - Error: column '' имеет неподдерживаемый тип

Чтобы воспроизвести его я создал подмножество Файл подмножество RDATA доступна здесь:.. rdata file including dftest data.frame Во-первых, используя подмножество I предоставили код.:

dftest %>% 
    group_by(file) %>% 
    summarise(missings=sum(is.na(v131))) 

создаст ошибку: Ошибка: колонка 'файл' имеет неподдерживаемый тип

НТР (dftest) возвращает:

'data.frame': 756345 obs. of 2 variables: 
$ file: atomic bjir31fl.dta bjir31fl.dta bjir31fl.dta bjir31fl.dta ... 
    ..- attr(*, "levels")= chr 
$ v131: Factor w/ 330 levels "not of benin",..: 6 6 6 6 1 1 1 9 9 9 ... 

Однако, взяв подмножество подмножества и снова запустив команду dplyr, создаст ожидаемый результат.

dftest <- dftest[1:756345,] 
dftest %>% 
    group_by(file) %>% 
    summarise(missings=sum(is.na(v131))) 

ул (dftest) теперь возвращает:

'data.frame': 756345 obs. of 2 variables: 
$ file: chr "bjir31fl.dta" "bjir31fl.dta" "bjir31fl.dta" "bjir31fl.dta" ... 
$ v131: Factor w/ 330 levels "not of benin",..: 6 6 6 6 1 1 1 9 9 9 ... 

Кто-нибудь есть какие-либо предложения о том, что могло бы вызвать эту ошибку, и что с этим делать. В моем исходном файле у меня 300 переменных, а dplyr утверждает, что большинство из них имеют неподдерживаемый тип.

Спасибо.

+1

Как вы создали 'dftest'? Я никогда не видел data.frame со столбцом, который указан как «атомный». Кажется, это плохо сформированный data.frame. – MrFlick

+0

Да @MrFlick, что-то не так. Dftest происходит из data.frame с именем df, что является результатом добавления большого количества файлов STATA. Однако, поскольку некоторые метки факторов имеют длину строки 0, я изменяю это на длину строки 1. По-видимому, этот код создает проблему: 'for (x in (names (df))) { print (x) dflevels <- levels (df [[x]]) print (dflevels [dflevels == ""]) levels (df [[x]]) [levels (df [[x]]) == ""] <- "" df [[x]] [df [[x]] == ""] <- "" df [[x]] <- df [[x]] [, drop = TRUE] } ' – spesseh

+0

Этот код не имеет никакого смысла. Вы просто пытаетесь заменить метки нулевой длины на одно пространство? Как насчет только уровней 'for (x in names (df)) (df [[x]]) <- gsub ("^$ "," ", levels (df [[x]]))' – MrFlick

ответ

4

Это похоже на проблему с использованием filter, когда столбец кадра данных имеет атрибут. Например,

> df = data.frame(x=1:10, y=1:10) 
> filter(df, x==3) # Works 
    x y 
1 3 3 

Добавить атрибут в x колонке. Обратите внимание на то, что str(df) показывает x как atomic сейчас, и filter не работает:

> attr(df$x, 'width')='broad' 
> str(df) 
'data.frame': 10 obs. of 2 variables: 
$ x: atomic 1 2 3 4 5 6 7 8 9 10 
    ..- attr(*, "width")= chr "broad" 
$ y: int 1 2 3 4 5 6 7 8 9 10 
> filter(df, x==3) 
Error: column 'x' has unsupported type 

Чтобы сделать его работу, снимите атрибут:

> attr(df$x, 'width') = NULL 
> filter(df, x==3) 
    x y 
1 3 3 
+0

Спасибо. Кажется, это подходящее решение. Я увижу, исправляет ли я мою проблему и принимает ответ. – spesseh

+0

Я сообщил об этом как ошибке dplyr, см. Https://github.com/hadley/dplyr/issues/859 –

Смежные вопросы