R 基于另一列对ID列进行分类

R 基于另一列对ID列进行分类,r,dataframe,classification,aggregate,R,Dataframe,Classification,Aggregate,我想不出来。我有一个数据框 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=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
#指定剪切和标签

类首先分配类

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

> 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
> output
  1   2   3   4   5   6 
"3" "1" "2" "2" "2" "1" 
然后查找行中具有最高值的列名。假设在id中有相同数量的类时,通过选取最后一个标签(在本例中为较低的数字1)来解决关系


谢谢是的,这有助于添加类,但是现在,如果这是显而易见的,那么很抱歉,我如何知道id=1,例如,对应于哪个类(在这里的示例中,id=1是一个类3,因为它的“3”多于“2”或“1”)。如果我理解正确,您想要一个
id
,它将表示它包含的大多数类?如果我是对的,我修改了我的答案,这应该会有所帮助。对于边缘情况,您的定义不清楚:0.3应该被指定为3还是2?同样,0.7是2还是1?你是对的,我道歉。它应该是:1:0另一个选项是
c(3,2,1)[findInterval(per,c(0,0.3,0.7,1))]
再多一个:如果有一个平局(例如,对于id 6,类2和类3各有一个),哪个类应该分配给id?是的,忘记了:)如果有平局,它将分配给较低的类。在您的示例中,它转到第2类。我想在未来我可以实现对“per”本身的观察,并根据这一点做出决定,但现在,它属于下层阶级。谢谢很抱歉再次打扰您,但是,我如何跟踪ID?我的原始ID不是从1到n,但它们是大数字,“output”只有一列,即“class”。对不起,谢谢!在上面显示的
output
中,第一行(即1、2、3、4等)不是序号,而是
id
中的实际值。如果替换
id
值(例如,替换为“a”、“b”、“c”等),则仍应获得正确的标签。如果要将其存储到变量中,只需使用
names(output)
或类似的
output.df
> 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
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"