Преобразуйте структуру столбца в кадре данных в символ, если он существует, в противном случае не беспокойтесь - PullRequest
1 голос
/ 01 апреля 2020

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

Код в функции, которую я пробовал, следующий:

with(df, if("name of column" %in% colnames(df)) as.character)

к сожалению, это не работает. Заранее спасибо!

PS В моем скрипте есть еще один код, который добавит "" ко всем символьным полям, поэтому получение их не является проблемой, просто фактическое преобразование в символьное поле.

1 Ответ

0 голосов
/ 01 апреля 2020

Мы можем написать простую функцию проверки имен:

    check_names<- function(df, col_name = "Species"){
  if(col_name %in% names(df)){
    df[[col_name]]<- as.character(df[[col_name]])

  }

  df
}
str(check_names(iris,"Species"))

РЕДАКТИРОВАТЬ

Измененная ниже функция будет работать для нескольких столбцов:

check_names<- function(df, col_names = NULL){
  if(all(col_names %in% names(df))){

    df[,col_names]<- sapply(df[,col_names],as.character)

  }

  df
}

Результат с использованием вышеуказанного:


str(check_names(iris,c("Species","Sepal.Length")))
'data.frame':   150 obs. of  5 variables:
 $ Sepal.Length: chr  "5.1" "4.9" "4.7" "4.6" ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : chr  "setosa" "setosa" "setosa" "setosa" ...

Исходный результат:

data.frame':    150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : chr  "setosa" "setosa" "setosa" "setosa" .


# non existent names
str(check_names(iris,"nope"))
'data.frame':   150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...