根据另一列

时间:2015-08-06 07:46:54

标签: 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对应于该分区,即id = 1对应于“1”。所以这个例子看起来像是:

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

我发现了这个

R- selecting a row based on characteristics of another column in that row

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

谢谢!

2 个答案:

答案 0 :(得分: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的可能性就越大。

答案 1 :(得分:1)

首先分配类

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

参数right=FALSE用于处理在注释中指定的边缘情况。

然后找到每个id的类数

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中具有相同数量的类时的关系通过选择最后一个标签(在这种情况下,较低的数字1)来解决

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"