在R中使用数据框,级别和因素是什么

时间:2019-03-16 17:01:28

标签: r dataframe

有人可以帮助我解决数据框中的因素和水平吗?我对这是如何工作感到非常困惑。

这是我想做的->如何在df.empty中添加两行,这些行具有正确的数据类型:

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 :(得分:0)

如果您来自统计背景,则可以将因子视为分类变量。 在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")
#

输出

  

头(植物生长)

  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
  

str(植物生长)

'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

他们两个都应该与您一起正常工作!

答案 1 :(得分:0)

为了保留已定义变量的类,您必须做两件事:

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"

或使用stringAsFactors = 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"

我以为它几乎是重复的。但是最后,这个问题向我提出了更多问题。

希望有帮助。