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

标签 r r-factor

我在 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/

相关文章:

r - 从 R 中的光栅文件中获取数据

r - 如何在R中将UTM坐标转换为纬度和经度

r - 如何使用 count(x)>2 等过滤器删除观察值?

r - 连接数据框的行

r - 将因子转换为数字而不丢失信息 R (as.numeric() 似乎不起作用)

r - 将科学记数法中的 p 值格式化为常规

r - int64 包有替代品吗?

r - 包含NA的因子列的唯一值=> “Hash table is full”错误

组合因子时返回字符串向量而不是整数向量

r - 按名称更改 data.tables 中的因子水平