结合两个(布尔)分类因子两个新的

时间:2018-06-02 13:17:02

标签: 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

我想添加一个新类别,其中包含a和b的组合,以便:

> 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

我不想懒惰,为自己考虑一下:

my_data$c <- as.numeric(as.factor(my_data$a + 1 + (my_data$b + 1) * 2))

这很接近,但我发现它并不特别优雅。 因此,可以理解基础R中的任何更好的解决方案。 当然还有像reshape2这样的软件包可以提供类似的功能。

4 个答案:

答案 0 :(得分:6)

对于您提供的所有案例,以下逻辑似乎已足够。

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

答案 1 :(得分:2)

基础R的另一个选择:

r <- rle(do.call(paste0, my_data))
r$values <- seq_along(r$values)
my_data$c <- inverse.rle(r)

结果:

> 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 <- rle(do.call(paste0, my_data))$lengths
my_data$c <- rep(seq_along(r), r)

答案 2 :(得分:2)

问题中的预期输出只是输入,即基数2中的数字转换为基数10加1 因此,寻找一个从基数2转换为基数10的函数,我找到了this SO question的接受答案。

因此apply()将该函数添加到数据框中。

apply(my_data, 1, bitsToInt) + 1
#[1] 1 2 3 4 4

答案 3 :(得分:1)

files = map(lambda f: os.path.join(root, f), files) 的一般解决方案:

files = [os.path.join(root, f) for f in files]

等效基数:

dplyr