通过 R 中的聚合计数因子观察
Counting factor observation via aggregate in R
我的载体是
Name
s1
s1
s1
s2
s2
s3
我需要计算每个值出现的次数。预期的输出是这样的
Names No.
s1 3
s2 2
s3 1
我正在为
使用聚合函数
aggregate(case2$Name,by=list(Names =case2$Name),table)
它给了我正确的结果,但是是诊断矩阵形式,而不是我预期输出中的另一个向量。
如果我像这里一样尝试带计数的聚合函数
aggregate(case2$Name,by=list(Names =case2$Name),count)
它给我这个错误
Error in UseMethod("group_by_") :
no applicable method for 'group_by_' applied to an object of class "factor"
不确定我该怎么办?
使用对 table 的简单调用,例如
table(Name)
对于您的示例,您会发现类似于...
> Name = as.factor( c ( 's1' , 's1' , 's1' , 's2' , 's2' , 's3' ) )
> Name
[1] s1 s1 s1 s2 s2 s3
Levels: s1 s2 s3
> table(Name)
Name
s1 s2 s3
3 2 1
> t <- table(Name)
> str(t)
'table' int [1:3(1d)] 3 2 1
- attr(*, "dimnames")=List of 1
..$ Name: chr [1:3] "s1" "s2" "s3"
> t[1]
s1
3
> t[2]
s2
2
> t[3]
s3
1
> t['s1']
s1
3
> str(t['s1'])
Named int 3
- attr(*, "names")= chr "s1"
> sprintf( "abcd = %d" , t[1] )
[1] "abcd = 3"
> t[1] + 5
s1
8
同意 table(Name)
是最直接的方法,但作为参考,使用 aggregate
获得相同结果的正确语法是:
aggregate(Name, by=list(Name), length)
@jxramos 的解决方案非常有效,但 table
格式有时会有点不方便。存储在矩阵、数据帧或向量中的数据通常更容易处理。
如果你想要一个矩阵作为输出(在这种情况下只有一列,所以它本质上是一个向量),你可以像这样执行一个小的修改:
v1 <- c ('s1' , 's1' , 's1' , 's2' , 's2' , 's3' )
v2 <- as.matrix(table(v1))
colnames(v2) <- "Name"
这是输出:
> v2
Name
s1 3
s2 2
s3 1
我的载体是
Name
s1
s1
s1
s2
s2
s3
我需要计算每个值出现的次数。预期的输出是这样的
Names No.
s1 3
s2 2
s3 1
我正在为
使用聚合函数aggregate(case2$Name,by=list(Names =case2$Name),table)
它给了我正确的结果,但是是诊断矩阵形式,而不是我预期输出中的另一个向量。
如果我像这里一样尝试带计数的聚合函数
aggregate(case2$Name,by=list(Names =case2$Name),count)
它给我这个错误
Error in UseMethod("group_by_") :
no applicable method for 'group_by_' applied to an object of class "factor"
不确定我该怎么办?
使用对 table 的简单调用,例如
table(Name)
对于您的示例,您会发现类似于...
> Name = as.factor( c ( 's1' , 's1' , 's1' , 's2' , 's2' , 's3' ) )
> Name
[1] s1 s1 s1 s2 s2 s3
Levels: s1 s2 s3
> table(Name)
Name
s1 s2 s3
3 2 1
> t <- table(Name)
> str(t)
'table' int [1:3(1d)] 3 2 1
- attr(*, "dimnames")=List of 1
..$ Name: chr [1:3] "s1" "s2" "s3"
> t[1]
s1
3
> t[2]
s2
2
> t[3]
s3
1
> t['s1']
s1
3
> str(t['s1'])
Named int 3
- attr(*, "names")= chr "s1"
> sprintf( "abcd = %d" , t[1] )
[1] "abcd = 3"
> t[1] + 5
s1
8
同意 table(Name)
是最直接的方法,但作为参考,使用 aggregate
获得相同结果的正确语法是:
aggregate(Name, by=list(Name), length)
@jxramos 的解决方案非常有效,但 table
格式有时会有点不方便。存储在矩阵、数据帧或向量中的数据通常更容易处理。
如果你想要一个矩阵作为输出(在这种情况下只有一列,所以它本质上是一个向量),你可以像这样执行一个小的修改:
v1 <- c ('s1' , 's1' , 's1' , 's2' , 's2' , 's3' )
v2 <- as.matrix(table(v1))
colnames(v2) <- "Name"
这是输出:
> v2
Name
s1 3
s2 2
s3 1