我在 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
尽管创建了中断,但在 c1
中分配的整数会更改结果。当我在没有 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")
感谢您的帮助!
最佳答案
问题在于 cut()
都输出了一个因子,但是由于它们具有不同的级别,因此它们被强制转换为整数。一个解决方案可能是用 as.character()
包围你的 cut()
,从而保留强制转换的级别,然后是 factor()
整个输出:
DF$c1=factor(ifelse(DF$a1=="a",
as.character(cut(DF$b1,breaks = c(0,25,50,70,max(DF$b1)),right = TRUE,include.lowest = TRUE)),
ifelse(DF$a1=="b",
as.character(cut(DF$b1,breaks = c(0,50,max(DF$b1)),right = TRUE,include.lowest = TRUE)),NA)))
DF
a1 b1 c1
1 a 10.15 [0,25]
2 a 25.10 (25,50]
3 a 32.40 (25,50]
4 a 56.70 (50,70]
5 a 89.02 (70,99.8]
6 b 90.50 (50,99.8]
7 b 78.53 (50,99.8]
8 b 98.12 (50,99.8]
9 b 34.30 [0,50]
10 b 99.75 (50,99.8]
关于r - R 中函数 cut 和 ifelse 之间的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34965401/