根据另一列对 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()))
对于给定的 id
,count
越高,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"
我想不通。我有一个数据框
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()))
对于给定的 id
,count
越高,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"