新创建的数据框丢失了其向量类别的标签。

3
我有一个类似这样的数据框:
> str(dynamics)
'data.frame':   3517 obs. of  3 variables:
 $ id   : int  1 2 3 4 5 6 7 8 9 10 ...
 $ y2015: int  245 129 301 162 123 125 115 47 46 135 ...
 $ y2016: int  NA 385 420 205 215 295 130 NA NA 380 ...

我取出三个向量并将它们命名为不同的名称,
第一列:
> plantid <- dynamics$id
> head(plantid)
[1] 1 2 3 4 5 6

第二列:
(我将其分为不同的类并标记为2、3、4和5)

> y15 <- dynamics$y2015
> year15 <- cut(y15, breaks = c(-Inf, 50, 100, 150, Inf), labels = c("2", "3", "4", "5"))
> str(year15)
 Factor w/ 4 levels "2","3","4","5": 4 3 4 4 3 3 3 1 1 3 ...
> head(year15)
[1] 5 4 5 5 4 4
Levels: 2 3 4 5

第三栏:
(这里也一样)

> y16 <- dynamics$y2016
> year16 <- cut(y16, breaks = c(-Inf, 50, 100, 150, Inf), labels = c("2", "3", "4", "5"))
> str(year16)
 Factor w/ 4 levels "2","3","4","5": NA 4 4 4 4 4 3 NA NA 4 ...
> head(year16)
[1] <NA> 5    5    5    5    5   
Levels: 2 3 4 5

到目前为止还不错!
问题出现在我通过cbind()将上述3个向量组合成一个新的数据框时,新创建的向量级别消失了。
看看我的代码:
SD1 = data.frame(cbind(plantid, year15, year16))
head(SD1)

我得到了这样的数据框:

> head(SD1)
  plantid year15 year16
1       1      4     NA
2       2      3      4
3       3      4      4
4       4      4      4
5       5      3      4
6       6      3      4

如您所见,第二列和第三列的级别已从2, 3, 4, 5改回1, 2, 3, 4
我该如何修复它?
1个回答

2

cbind通常用于将对象组合成矩阵。它会剥离输入的特殊属性,以确保它们能够兼容地组合成单个对象。这意味着具有特殊属性的数据类型(例如因子和日期的名称和格式属性)将简化为其底层数值表示形式。这就是为什么cbind会将您的因子转换为数字的原因。

相反,data.frame()本身将保留各个对象的属性。在这种情况下,您使用cbind是不必要的。要保留因子级别,只需使用:

SD1 <- data.frame(plantid, year15, year16)

@jdobres,非常感谢你的详细解释。我已经做完了。 - Muneer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接