如何计算一列中每个值与R中另一列中每个值对应的频率?

如何计算一列中每个值与R中另一列中每个值对应的频率?,r,aggregate,R,Aggregate,我的数据集如下: col1 col2 A 1 A 2 A 2 B 1 B 1 C 1 C 1 C 2 我希望输出为: col1 col2 Frequency A 1 1 A 2 2 B 1 2 C 1 2 C 2 1 我尝试使用聚合函数和table函数,但无

我的数据集如下:

 col1   col2
    A   1
    A   2
    A   2
    B   1
    B   1
    C   1
    C   1
    C   2
我希望输出为:

 col1  col2  Frequency
    A     1      1
    A     2      2
    B     1      2
    C     1      2
    C     2      1

我尝试使用聚合函数和table函数,但无法获得理想的结果

您可以添加一个虚拟列,或使用
行名
对以下内容进行聚合:

aggregate(rownames(mydf) ~ ., mydf, length)
#   col1 col2 rownames(mydf)
# 1    A    1              1
# 2    B    1              2
# 3    C    1              2
# 4    A    2              2
# 5    C    2              1
也可以正常工作,但会将数据中可能不存在的组合报告为“0”:


另一个不错的方法是使用“data.table”:


您可以添加虚拟列或使用
行名
对以下内容进行聚合:

aggregate(rownames(mydf) ~ ., mydf, length)
#   col1 col2 rownames(mydf)
# 1    A    1              1
# 2    B    1              2
# 3    C    1              2
# 4    A    2              2
# 5    C    2              1
也可以正常工作,但会将数据中可能不存在的组合报告为“0”:


另一个不错的方法是使用“data.table”:

如果您的数据是

col1 <- c("A","A","A","B","B","C","C","C")
col2 <- c(1,2,2,1,1,1,1,2)
df <- data.frame(col1,col2)
如果您的数据是

col1 <- c("A","A","A","B","B","C","C","C")
col2 <- c(1,2,2,1,1,1,1,2)
df <- data.frame(col1,col2)

删除了我的答案,其中也使用了data.table,如果你在一篇帖子中把所有内容都整合到了一起:),我会使用setDT而不是as.data.table,并恰当地命名该列:
setDT(df)[,((“频率”=.N),by=(col1,col2)]
@grrgrrbla,谢谢你的评论,但是(1)我不喜欢使用
setDT
修改其他人的数据,除非我知道他们知道这是怎么做的,(2)重命名列是一项相当标准的任务,在我看来对这里提出的问题并不重要。(我知道这是个人偏好的问题。)好的方面,我习惯于完美地为人们服务,但你是对的,他们的一点工作应该是可行的。。。你对setDT的观点也是可以理解的,因为如果人们不理解它的功能,它可能会导致bug,哈哈,我不确定这个网站是否应该“完美地为人们服务”(另一位新用户说)删除了我的答案,该答案也使用了数据,我会使用setDT而不是as.data.table,并恰当地命名该列:
setDT(df)[,(“频率”=.N),by=.(col1,col2)]
@grrgrrbla,谢谢你的评论,但是(1)我不喜欢使用
setDT
修改其他人的数据,除非我知道他们知道这是什么,以及(2)重命名专栏是一项相当标准的任务,在我看来,这对这里提出的问题并不重要。(我知道这是个人偏好的问题。)好的方面,我已经习惯于完美地为人们服务,但你是对的,他们的一点工作应该是可行的。。。你关于setDT的观点也是可以理解的,因为如果人们不理解它的功能,它可能会导致bug,哈哈,我不确定这个网站是否应该“完美地为人们服务”(另一个新用户说)为这个问题创建某种社区维基帖子不是很可取吗,既然这个问题经常出现?既然这个问题经常出现,难道不需要为它创建一些社区维基帖子吗?这可以缩短为:
df%>%count(col1,col2)
这可以缩短为:
df%>%count(col1,col2)
library(dplyr)
df %>% group_by(col1,col2) %>% summarize(frequency=n())


# output
  col1 col2 frequency
1    A    1         1
2    A    2         2
3    B    1         2
4    C    1         2
5    C    2         1