Работа с Dataframes в R, что такое уровень и фактор - PullRequest
1 голос
/ 16 марта 2019

Может кто-нибудь помочь мне с факторами и уровнями в рамках датафрейма, пожалуйста? Я очень смущен тем, как это работает.

Вот что я пытаюсь сделать -> Как добавить две строки в df.empty, который имеет тип данных RIGHT:

df.empty <- data.frame(column1 = numeric(), column2 = character(), column3 = factor())
df.empty$column3<-factor(df.empty$column3,levels=c("A","B","C"))

Я попробовал две вещи:

newRow <- c(-2,"MyString","B")
incorrectRow <- c(-2,"MyString","C")

Первый работал, а второй нет, я не могу понять, почему. они имеют одинаковый формат, я попытался изменить "C" на "B" или "A", все еще не работает.

Я думаю, что это как-то связано с кодом =c("A","B",C"), указанным выше, но не знаю, как это сделать.

Ответы [ 2 ]

0 голосов
/ 16 марта 2019

Чтобы сохранить классы определенных переменных, вы должны сделать две вещи:

1) Установите stringsAsFactors = FALSE, чтобы символьная переменная не стала фактором.

2) Новая строка должна быть списком.

Как в этом примере:

> df.empty <- data.frame(column1 = numeric(), column2 = character(),
+                        column3 = factor(levels=c("A","B","C")), stringsAsFactors = FALSE)
> 
> newRow <- list(-2, "MyString","B")
> incorrectRow <- list(-2, "MyString", "C")
> 
> # Not mess columns names
> 
> df.empty[nrow(df.empty) + 1,] <- newRow
> df.empty[nrow(df.empty) + 1,] <- incorrectRow
> 
> df.empty
  column1  column2 column3
1      -2 MyString       B
2      -2 MyString       C
> summary(df.empty)
    column1     column2          column3
 Min.   :-2   Length:2           A:0    
 1st Qu.:-2   Class :character   B:1    
 Median :-2   Mode  :character   C:1    
 Mean   :-2                             
 3rd Qu.:-2                             
 Max.   :-2                             

Для сохранения имен столбцов, кредит идет на этот ответ: https://stackoverflow.com/a/15718454/8382633

Моя первая попытка была также с rbind, но у нее есть некоторые недостатки. Он не сохраняет имена столбцов, а также конвертирует все строки в факторы, или, если вы установите stringsAsFactors = FALSE, все факторы в строки !!

> df.empty <- rbind.data.frame(df.empty, newRow, incorrectRow)
> 
> summary(df.empty)
   c..2...2.  c..MyString....MyString.. c..B....C..
 Min.   :-2   MyString:2                B:1        
 1st Qu.:-2                             C:1        
 Median :-2                                        
 Mean   :-2                                        
 3rd Qu.:-2                                        
 Max.   :-2                                        
> class(df.empty$c..MyString....MyString..)
[1] "factor"

или со строкамиAsFactors = FALSE:

> df.empty <- rbind.data.frame(df.empty, newRow, incorrectRow, stringsAsFactors = FALSE)
> 
> summary(df.empty)
   c..2...2.  c..MyString....MyString.. c..B....C..       
 Min.   :-2   Length:2                  Length:2          
 1st Qu.:-2   Class :character          Class :character  
 Median :-2   Mode  :character          Mode  :character  
 Mean   :-2                                               
 3rd Qu.:-2                                               
 Max.   :-2                                               
> 
> class(df.empty$c..B....C..)
[1] "character"

Я думал, что это было близко к дубликату. Но, в конце концов, эти вопросы открыли мне больше вопросов.

Надеюсь, это поможет.

0 голосов
/ 16 марта 2019

Если вы исходите из статистического фона, вы можете думать о факторе как о категориальной переменной. В R фактор является категориальной переменной, которая может содержать много уровней. Уровни - это числа различных значений для этой переменной.

Давайте загрузим фрейм данных, чтобы проверить это.

data("PlantGrowth")
head(PlantGrowth)
#you can see here output of categorical column called 'group'
#
str(PlantGrowth)
#by typing fuction str(), it will till you that this column is a factor which has 3 levels ("ctrl", "trt1" , "trt2")
#

выход

голова (PlantGrowth)

  weight group
1   4.17  ctrl
2   5.58  ctrl
3   5.18  ctrl
4   6.11  ctrl
5   4.50  ctrl
6   4.61  ctrl

ул (PlantGrowth)

'data.frame':   30 obs. of  2 variables:
 $ weight: num  4.17 5.58 5.18 6.11 4.5 4.61 5.17 4.53 5.33 5.14 ...
 $ group : Factor w/ 3 levels "ctrl","trt1",..: 1 1 1 1 1 1 1 1 1 1 ...

Ваша пробная версия не сработает, потому что все, что вы делаете, это определение различных значений переменной. так что если вы попробуете str(df.empty), вы получите отображаемые уровни!

> str(df.empty)
'data.frame':   0 obs. of  3 variables:
 $ column1: num 
 $ column2: Factor w/ 0 levels: 
 $ column3: Factor w/ 3 levels "A","B","C"  

Наконец, если вы хотите объединить строку в фрейм данных, вы должны использовать rbind ()

 newRow <- c(-2,"MyString","B") 
 incorrectRow <- c(-2,"MyString","C")

rbind(df.empty, newRow)
  X..2. X.MyString. X.B.
1    -2    MyString    B

rbind(df.empty, incorrectRow)
  X..2. X.MyString. X.C.
1    -2    MyString    C

Они оба должны корректно работать с вами!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...