r - 基于非零填充列组合创建组

标签 r

我很难解决这个问题。我将在示例的基础上最好地解释它,让我们看看下面的数据:

    order type_a type_b type_c type_d
1     1      0     50     10      0
2     2     10      0      0     80
3     3     15      0      0     35
4     4      0      0     30      0
5     5      0     20     40      0

dput :
data <- structure(list(order = c(1, 2, 3, 4, 5), type_a = c(0, 10, 15, 
0, 0), type_b = c(50, 0, 0, 0, 20), type_c = c(10, 0, 0, 30, 
40), type_d = c(0, 80, 35, 0, 0)), .Names = c("order", "type_a", 
"type_b", "type_c", "type_d"), row.names = c(NA, -5L), class = "data.frame")

我们可以看到第一列告诉我们订单号,其余的列告诉我们什么属于这个订单。此外,如果 type_* 列填充为 0,则它不相关。

我想创建一个新列,根据“订单描述”--> type_* 列定义组。例如,对于订单 1 和订单 5,我们有相同的 type_* 列,但没有填充 0 值,因此它们属于同一组,订单 2 和 3 也是如此,依此类推。

我的最终结果应该是这样的:
   order type_a type_b type_c type_d   group
1     1      0     50     10      0 group_1
2     2     10      0      0     80 group_2
3     3     15     10      0     35 group_2
4     4      0      0     30      0 group_3
5     5      0     20     40      0 group_1

仅供引用,在我的真实数据中,我确实有超过 4 列 type_* --> 大约有 10-15 列!

感谢帮助!

最佳答案

您的组由第 2 到 5 列中 0 的存在与否来定义。测试 0,将 TRUE/FALSE 值折叠为字符串,您将获得每个组的唯一字符串。转换为因子:

> data$group = factor(apply(data[,2:5] ==0,1,paste,collapse=""))
> data
  order type_a type_b type_c type_d              group
1     1      0     50     10      0 TRUEFALSEFALSETRUE
2     2     10      0      0     80 FALSETRUETRUEFALSE
3     3     15      0      0     35 FALSETRUETRUEFALSE
4     4      0      0     30      0  TRUETRUEFALSETRUE
5     5      0     20     40      0 TRUEFALSEFALSETRUE

现在名字很难看,所以改变级别:
> class(data$group)
[1] "factor"
> levels(data$group)=paste("group_",1:length(levels(data$group)))
> data
  order type_a type_b type_c type_d    group
1     1      0     50     10      0 group_ 2
2     2     10      0      0     80 group_ 1
3     3     15      0      0     35 group_ 1
4     4      0      0     30      0 group_ 3
5     5      0     20     40      0 group_ 2

如果所有这些大写的 TRUEFALSE 伤害你的眼睛,一个简单的修复将产生一个整洁的二进制数:
> data$group = factor(apply(0+(data[,2:5] ==0),1,paste,collapse=""))
> data
  order type_a type_b type_c type_d group
1     1      0     50     10      0  1001
2     2     10      0      0     80  0110
3     3     15      0      0     35  0110
4     4      0      0     30      0  1101
5     5      0     20     40      0  1001

关于r - 基于非零填充列组合创建组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52659842/

相关文章:

r - R 数据框中的十个最高列值

r - 梯度范围从某个值到零的矩阵

r - 估计单独的回归并针对不同的数据集按组生成预测

r - 如何使用 ggplot2 包在 map 上绘制不同颜色的经纬度点?

r - 创建一个从开始计数到当前值的列表

r - 通过关键字指定 geom_text 的位置,如 "top"、 "bottom"、 "left"、 "right"、 "center"

r - 使用过滤器的最小值或最大值

R Shiny 应用程序: renderUI does not work with nested modules R6 classes

r - 如何根据元素的位置关联向量?

r - 如何加快从栅格中提取缓冲区中土地覆盖类型的比例?