Почему gsub автоматически меняет фактор в характер - PullRequest
3 голосов
/ 30 сентября 2019

После загрузки данных R преобразует символьные строки как факторы, если не указано иное. Затем мы должны преобразовать Факторы в символьные или числовые на основе базовых данных. В случае числовых значений мы сначала преобразуем в символьную строку, используя as.character (), а затем преобразуем результат в as.integer () в случае целочисленных значений.

Но после очистки символов изчисло с помощью gsub, R автоматически преобразует очищенные строки в символы.

Например:

> sal <- data.frame(name = c('abc','def','ghi','pqr'),
+                   Salary = c('$65,000','$102,000','$85,000','$72,000'))
> str(sal)
'data.frame':   4 obs. of  2 variables:
 $ name  : Factor w/ 4 levels "abc","def","ghi",..: 1 2 3 4
 $ Salary: Factor w/ 4 levels "$102,000","$65,000",..: 2 1 4 3
> sal$Salary <- gsub('\\$','',sal$Salary)
> sal$Salary <- gsub(',','',sal$Salary)
> str(sal)
'data.frame':   4 obs. of  2 variables:
 $ name  : Factor w/ 4 levels "abc","def","ghi",..: 1 2 3 4
 $ Salary: chr  "65000" "102000" "85000" "72000"
> 

Мы видим, как после gsub столбец «Зарплата» меняется с Фактора на Символ. Может кто-нибудь сообщить мне, если gsub также выполняет здесь операцию as.character ()? Если это так, не преобразует ли столбец целые числа, поскольку все значения являются целыми числами?

Ответы [ 3 ]

2 голосов
/ 30 сентября 2019

Вы можете изменить уровни вашего фактора напрямую, которые являются символами:

sal <- data.frame(name = c('abc','def','ghi','pqr'),
              Salary = c('$65,000','$102,000','$85,000','$72,000'))


levels(sal$Salary) <- gsub('\\$|,', '', levels(sal$Salary))
str(sal)


> 'data.frame': 4 obs. of  2 variables:
 $ name  : Factor w/ 4 levels "abc","def","ghi",..: 1 2 3 4
 $ Salary: Factor w/ 4 levels "102000","65000",..: 2 1 4 3
1 голос
/ 30 сентября 2019

Да, gsub выполняет as.character. Если вы наберете gsub в консоли, вы увидите функцию

function (pattern, replacement, x, ignore.case = FALSE, perl = FALSE, 
fixed = FALSE, useBytes = FALSE) 
{
    if (!is.character(x)) 
        x <- as.character(x)
    .Internal(gsub(as.character(pattern), as.character(replacement), 
         x, ignore.case, perl, fixed, useBytes))
}

И нет, она не будет преобразована в целое число напрямую, поскольку она всегда возвращает символьный вектор. Из ?gsub

sub и gsub возвращают символьный вектор такой же длины и с теми же атрибутами, что и x (после возможного приведения к символу).

0 голосов
/ 30 сентября 2019

Вы, кажется, задаете вопрос «почему». Ответ в этом случае, несомненно, связан с тем фактом, что результат должен быть характерным, а не факторным, поскольку уровни фактора являются атрибутами, а не фактическими значениями. Значения факторной переменной НЕ являются теми, которые вы видите в выходных данных str, а являются значениями, начинающимися с 1. Первый элемент: «65000» имел бы значение 2, но отображался бы как 65000.

Таким образом, вы были правы, что значение было целым числом, а не значением, которое вы считали. Второй элемент имел бы значение 1, потому что его уровень атрибута имел бы наименьший лексический порядок, несмотря на то, что в конечном итоге он представлял собой наибольшее числовое значение после его преобразования в числовое значение.

...