根据另一列对 ID 列进行分类

Classify ID column based on another column

我想不通。我有一个数据框

id=c(1,2,3,4,2,6,1,1,6,5,4,2)
per=c(0.1,0.9,0.6,0.5,0.8,0.9,0.2,0.3,0.7,0.5,0.4,0.3)
df=data.frame(id=id,per=per)

我想将 "per" 列分为三个条件,比方说,在 0 和 0.3 之间(我们分配 3)、0.3 和 0.7(我们分配 2)以及 0.7 和 1(我们分配分配一个 1)。

我的想法是将每个唯一id分配给该分区的最大计数,即如果id=1在0.7-1范围内有更多"per",那么该id对应于该分区,即 id = 1 对应于“1”。所以这个例子看起来像:

 id class
  1     3
  2     1
  3     2
  4     2
  5     2
  6     1

我找到了这个

但我需要上一步,即分类,才能达到这一点。

谢谢!

您可以使用 R 中的 cut 函数轻松实现此目的:

# specify cut, and labels
class <- cut(per, breaks = c(0, 0.3, 0.7, 1), labels = c(3, 2, 1))

#cbind with original data frame
df_new <- cbind(df, class)

#view
df_new

#     id  per   class
# 1   1   0.1     3
# 2   2   0.9     1
# 3   3   0.6     2

希望对您有所帮助!

更新:

# use dplyr package to summarise
(df_stats <- df_new %>% group_by(id,class) %>% summarise(count=n()))

对于给定的 idcount 越高,id 属于相应 class 的可能性就越大。

首先分配classes

cl <- cut(per, breaks = c(0, 0.3, 0.7, 1), labels = c(3, 2, 1), right=FALSE)

参数 right=FALSE 用于处理您在评论中指定的边缘情况。

然后找到每个 idclasses 的数量

chk <- table(id, cl)

结果是

> chk
   cl
id  3 2 1
  1 2 1 0
  2 0 1 2
  3 0 1 0
  4 0 2 0
  5 0 1 0
  6 0 0 2

然后在一行中找到具有最高值的列名。假设当 id 中有相同数量的 class 时,通过选择最后一个标签(在本例中为较低的数字)

来解决关系
output <- apply(chk, 1, function(x) names(rev(which(x==max(x))))[1])

结果是

> output
  1   2   3   4   5   6 
"3" "1" "2" "2" "2" "1"