неожиданное поведение rbind.fill при объединении столбцов разного класса

Я попытался использовать функцию rbind.fill из пакета plyr для объединения двух фреймов данных со столбцом A, который содержит только цифры в первом фрейме данных, но (также) строки во втором фрейме данных. Воспроизводимый пример:

data1 <- data.frame(A=c(11111,22222,33333), b=c(4444,444,44444), c=c(5555,66666,7777))
data2 <- data.frame(A=c(1234,"ss150",123456), c=c(888,777,666))
rbind.fill(data1,data2)

Это привело к выводу ниже с неверными данными в столбце A, строках 4,5,6. Это не выдавало сообщение об ошибке.

        A     b     c
1  107778 33434     6
2 1756756     4     7
3 2324234     5     8
4       2    NA 14562
5       3    NA 45613
6       1    NA    14

Я ожидал, что функция принудит весь столбец к классу символов или, по крайней мере, отобразит NA или предупреждение. Вместо этого он вставил цифры, которые я не понимаю (в реальном файле это двузначные числа, которые не отсортированы). В документации не указано, что столбцы должны быть тот же тип в объединенных data.frames.

Как я могу получить эту комбинацию?

       A     b     c
1  11111  4444  5555
2  22222   444 66666
3  33333 44444  7777
4   1234    NA   888
5  ss150    NA   777
6 123456    NA   666

person Kastany    schedule 03.05.2016    source источник


Ответы (1)


посмотри на class(data2$A). Это фактор, который на самом деле является целым числом с вектором метки. Используйте stringsAsFactors=F при создании вашего data.frame или в read.csv и друзьях. Это заставит переменные быть либо числовыми, либо символьными векторами.

data1 <- data.frame(A=c(11111,22222,33333), b=c(4444,444,44444), c=c(5555,66666,7777))
data2 <- data.frame(A=c(1234,"ss150",123456), c=c(888,777,666), stringsAsFactors=FALSE)

rbind.fill(data1,data2)
person lmo    schedule 03.05.2016
comment
Спасибо, очень полезно! Я использовал stringsAsFactors (начинается с маленькой буквы, кстати) в импорте read.csv, и теперь он работает. (Каждый раз, когда я думаю, что понял немного больше о различных классах в R, происходит что-то вроде этого, и я знаю, что мне нужно больше читать... спасибо за вашу помощь!) - person Kastany; 03.05.2016