Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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,我很难解决这个问题。我将在示例的基础上对其进行最好的解释,让我们看看以下数据: 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

我很难解决这个问题。我将在示例的基础上对其进行最好的解释,让我们看看以下数据:

    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")
仅供参考,在我的真实数据中,我确实有超过4列类型\*-->大约有10-15列


谢谢你的帮助

您的组由第2列到第5列中是否存在0来定义。测试0,将真/假值折叠为一个字符串,您将得到每个组的唯一字符串。转换为系数:

> 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来表示它的实际用途。统计规划

set.seed(42)
cols <- grep("type_", names(d))
d$group <- kmeans(d[cols], 4)$cluster
# d$group <- paste0("group_", d$group)
set.seed(42)
colsdata.table解决方案

library(data.table)

setDT(data)[, id := .GRP, by = list( do.call(paste0, c( data.frame( data[,2:5] != 0 ) ) ) ) ][, id := paste0( "Group_", id)][]

#    order type_a type_b type_c type_d      id
# 1:     1      0     50     10      0 Group_1
# 2:     2     10      0      0     80 Group_2
# 3:     3     15      0      0     35 Group_2
# 4:     4      0      0     30      0 Group_3
# 5:     5      0     20     40      0 Group_1

我正要发布类似的内容,以避免您可以执行的
apply
调用
do.call(粘贴,c(data.frame(data[2:5]!=0),sep=“-”)
只是执行了一些基准测试-这要快得多。很好。@RonakShah和[2:5]您选择了第2:5行。。您可能是想[,2:5]选择列2:5。@Wimpel nope,[2:5]不选择行,[2:5]选择行。群集(组)的数量可能是2^个列,因为它是二进制数。如果您事先不知道有多少组,那么计算多少组以放入
kmeans
arg可能与实际计算一样复杂……是的,分析员必须做一些传统的工作,如肘部图。我说的是“乐趣”,我没有说任何关于实用的东西。几年前,我不再谈论实用和所有关于乐趣的东西(嘿,六角贴纸!),我注意到了/snark我很抱歉,我不理解你的评论,也不想让我上一次的评论显得粗鲁,如果这是你的意思/snark“不,没关系,只是有一种趋势,当呈现的“有趣”代码比需要更好地理解R的不那么“有趣”的解决方案慢25倍时,R会不断地强调东西是“有趣”的。“snark”就是我在这件事上是个脾气暴躁的老头子!
library(data.table)

setDT(data)[, id := .GRP, by = list( do.call(paste0, c( data.frame( data[,2:5] != 0 ) ) ) ) ][, id := paste0( "Group_", id)][]

#    order type_a type_b type_c type_d      id
# 1:     1      0     50     10      0 Group_1
# 2:     2     10      0      0     80 Group_2
# 3:     3     15      0      0     35 Group_2
# 4:     4      0      0     30      0 Group_3
# 5:     5      0     20     40      0 Group_1