我无法弄清楚这一点。我有一个数据框
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
但我需要上一步,即分类,以达到这一点。
谢谢!
答案 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()))
对于给定的id
,count
越高,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"