我正在使用R
处理一个数据框,其中包括一个数值变量和一个字符变量。我的数据框DF
长这样(最后一部分添加了dput
版本):
a1 b1
1 a 10.15
2 a 25.10
3 a 32.40
4 a 56.70
5 a 89.02
6 b 90.50
7 b 78.53
8 b 98.12
9 b 34.30
10 b 99.75
在 DF
中,变量 a1
是一个分组变量,b1
是一个数值变量。然后出现了问题。我想通过使用 cut
函数并考虑保存在 a1
中的组来创建一个名为 c1
的新变量。因此,我在代码的下一行结合了 ifelse()
和 cut()
两个函数:
DF$c1=ifelse(DF$a1=="a",
cut(DF$b1,breaks = c(0,25,50,70,max(DF$b1)),right = TRUE,include.lowest = TRUE),
ifelse(DF$a1=="b",
cut(DF$b1,breaks = c(0,50,max(DF$b1)),right = TRUE,include.lowest = TRUE),NA))
这行代码可以正常工作,但是在 c1
中创建的新值存在混淆的结果。与其显示因子,cut()
返回整数。然后,我得到了这个结果:
table(DF$c1,exclude=NULL)
1 2 3 4 <NA>
2 6 1 1 0
尽管创建了间隔,分配给的整数会改变结果。但是,如果不使用ifelse,这种情况就不会发生,但在这种情况下,我不同意对组的条件。例如,以下代码行返回此结果:
DF$c1=cut(DF$b1,breaks = c(0,25,50,70,max(DF$b1)),right = TRUE,include.lowest = TRUE)
table(DF$c1,exclude=NULL)
[0,25] (25,50] (50,70] (70,99.8] <NA>
1 3 1 5 0
我想知道如何解决ifelse()
和cut()
函数之间的行为,因为返回的整数会导致最终结果产生差异。在这个例子中,我只使用了a1
变量的两个组,但是我有一个包含许多组的大型数据库。这就是我结合这些函数以获得每个组的不同分割的原因。此外,断点的值可能会发生变化,因此手动包含标签可能会很耗时。这两个函数的组合是否可能返回每个组(因子)的正确标签,而不是整数?我的数据框DF
的dput()
版本如下:
DF<-structure(list(a1 = c("a", "a", "a", "a", "a", "b", "b", "b",
"b", "b"), b1 = c(10.15, 25.1, 32.4, 56.7, 89.02, 90.5, 78.53,
98.12, 34.3, 99.75)), .Names = c("a1", "b1"), row.names = c(NA,
-10L), class = "data.frame")
感谢您的帮助!
factor()
添加一个levels
参数来重新调整级别。由于我们无法确定确切的级别是什么,因此您需要进行一些尝试,但只需添加DF$c1 <- factor(DF$c1, levels = sort(levels(DF$c1)))
就可以解决问题。 - scoa