gpt4 book ai didi

r - R 中函数 cut 和 ifelse 之间的奇怪行为

转载 作者:行者123 更新时间:2023-12-01 09:52:32 24 4
gpt4 key购买 nike

我在 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 变量,但我有一个包含许多组的大型数据库。这就是我将这些功能结合起来为每个组进行不同切割的原因。中断的值也可以更改,因此以手动方式包含标签可能会很长。这两个函数的组合是否有可能为每个组(因子)而不是整数返回正确的标签。我的数据框 DFdput() 版本是下一个:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com