鉴于两个布尔,分类因素,我如何将它们的组合作为第三类?
> 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
这样的软件包可以提供类似的功能。
答案 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