有人可以帮助我解决数据框中的因素和水平吗?我对这是如何工作感到非常困惑。
这是我想做的->如何在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")
级代码有关,但不确定如何。
答案 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"
我以为它几乎是重复的。但是最后,这个问题向我提出了更多问题。
希望有帮助。