Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将两个(布尔)分类因子合并为两个新因子_R - Fatal编程技术网

R 将两个(布尔)分类因子合并为两个新因子

R 将两个(布尔)分类因子合并为两个新因子,r,R,给定两个布尔分类因子,如何将它们组合为第三类 > my_data <- data.frame(a = c(0, 0, 1, 1, 1), b = c(0, 1, 0, 1, 1)) > my_data a b 1 0 0 2 0 1 3 1 0 4 1 1 5 1 1 我不想偷懒,自己想了想: my_data$c <- as.numeric(as.factor(my_data$a + 1 + (my_data$b +

给定两个布尔分类因子,如何将它们组合为第三类

> my_data <- data.frame(a = c(0, 0, 1, 1, 1),
                        b = c(0, 1, 0, 1, 1))
> my_data
  a b
1 0 0
2 0 1
3 1 0
4 1 1
5 1 1
我不想偷懒,自己想了想:

my_data$c <- as.numeric(as.factor(my_data$a + 1 + (my_data$b + 1) * 2))
这很接近,但我不觉得它特别优雅。 因此,如果在R基中有更好的解决方案,我们将不胜感激。
当然也有一些软件包,比如Reformae2,可以提供类似的功能。

对于您提供的所有案例,下面的逻辑似乎已经足够了

my_data$c <- with(my_data, 2*a + b + 1)

my_data
  a b c
1 0 0 1
2 0 1 2
3 1 0 3
4 1 1 4
5 1 1 4

另一个带有基本R的选项:

r <- rle(do.call(paste0, my_data))
r$values <- seq_along(r$values)
my_data$c <- inverse.rle(r)
上述代码的较短版本:

r <- rle(do.call(paste0, my_data))$lengths
my_data$c <- rep(seq_along(r), r)

问题中的预期输出只是以基数2表示的数字转换为基数10加1的输入。 因此,寻找一个从基2转换到基10的函数,我找到了一个公认的答案

因此,这是一个将该函数应用于数据帧的问题

apply(my_data, 1, bitsToInt) + 1
#[1] 1 2 3 4 4
使用dplyr的通用解决方案:

A基本等效物:

temp <- unique(my_data)
temp$c <- seq(nrow(temp))
merge(my_data,temp)
#   a b c
# 1 0 0 1
# 2 0 1 2
# 3 1 0 3
# 4 1 1 4
# 5 1 1 4

c的计算逻辑是什么?如果它可以直接作为我的_数据$c计算,那么为什么你必须转换为因子然后是数值?假设没有案例缺失逻辑是:2*a+b+1我实际上喜欢这个解决方案,它是通用的,据我所知,它甚至可以处理非布尔向量,这不是我问题的一部分。是的,它应该是非常通用的,但可能不适用于列表列。在我看来,最适合你的是鲁伊的答案,因为你真正做的是将二进制转换成十进制。当前选择的解决方案对于大于9的字符或数字将不稳定。我考虑过将2列粘贴到第三列。事实上,这是一个非常好的解决方案,它甚至适用于非布尔向量,这当然不是问题的一部分。这个解决方案当然赢得了简短的代价。它对布尔向量非常有效和可靠。“我希望你们不介意我说,对于初学者来说,这可能有点困惑,尤其是如果他们不是计算机科学家的话。”尼古拉斯·布尔巴基不,我一点也不介意。事实上,似乎没有多少人注意到这一点,对某些人来说是显而易见的,而对其他人来说则不然。这是独立于一个人的代表。
apply(my_data, 1, bitsToInt) + 1
#[1] 1 2 3 4 4
library(dplyr)
my_data %>% mutate(c = group_indices(.,a,b))
#   a b c
# 1 0 0 1
# 2 0 1 2
# 3 1 0 3
# 4 1 1 4
# 5 1 1 4
temp <- unique(my_data)
temp$c <- seq(nrow(temp))
merge(my_data,temp)
#   a b c
# 1 0 0 1
# 2 0 1 2
# 3 1 0 3
# 4 1 1 4
# 5 1 1 4