根据组计算R中数据框中的行数

Jas*_*ald 36 r rowcount dataframe

我有一个这样的数据框R:

  ID   MONTH-YEAR   VALUE
  110   JAN. 2012     1000
  111   JAN. 2012     2000
         .         .
         .         .
  121   FEB. 2012     3000
  131   FEB. 2012     4000
         .           .
         .           .
Run Code Online (Sandbox Code Playgroud)

因此,每年的每个月都有n行,它们可以按任何顺序排列(意味着它们都不是连续的并且处于休息状态).我想计算每个行的行数,MONTH-YEAR即JAN有多少行.2012年,FEB有多少人.2012年等等.像这样的东西:

 MONTH-YEAR   NUMBER OF ROWS
 JAN. 2012     10
 FEB. 2012     13
 MAR. 2012     6
 APR. 2012     9
Run Code Online (Sandbox Code Playgroud)

我试着这样做:

n_row <- nrow(dat1_frame %.% group_by(MONTH-YEAR))
Run Code Online (Sandbox Code Playgroud)

但它不会产生所需的输出.我怎么能这样做?

Hea*_*ead 44

count()函数plyr你想要做什么:

library(plyr)

count(mydf, "MONTH-YEAR")
Run Code Online (Sandbox Code Playgroud)


A5C*_*2T1 33

这是一个示例,显示了table(.)(或者,更接近地匹配您想要的输出,data.frame(table(.))听起来像您要求的那样).

另请注意如何以其他人可以复制并粘贴到其会话中的方式共享可重现的样本数据.

这是(可重现的)样本数据:

mydf <- structure(list(ID = c(110L, 111L, 121L, 131L, 141L), 
                       MONTH.YEAR = c("JAN. 2012", "JAN. 2012", 
                                      "FEB. 2012", "FEB. 2012", 
                                      "MAR. 2012"), 
                       VALUE = c(1000L, 2000L, 3000L, 4000L, 5000L)), 
                  .Names = c("ID", "MONTH.YEAR", "VALUE"), 
                  class = "data.frame", row.names = c(NA, -5L))

mydf
#    ID MONTH.YEAR VALUE
# 1 110  JAN. 2012  1000
# 2 111  JAN. 2012  2000
# 3 121  FEB. 2012  3000
# 4 131  FEB. 2012  4000
# 5 141  MAR. 2012  5000
Run Code Online (Sandbox Code Playgroud)

以下是两种输出显示格式的每组行数的计算:

table(mydf$MONTH.YEAR)
# 
# FEB. 2012 JAN. 2012 MAR. 2012 
#         2         2         1

data.frame(table(mydf$MONTH.YEAR))
#        Var1 Freq
# 1 FEB. 2012    2
# 2 JAN. 2012    2
# 3 MAR. 2012    1
Run Code Online (Sandbox Code Playgroud)


And*_*ton 13

使用Ananda dummied的示例数据集aggregate(),这是一个使用的示例,它是核心R的一部分.aggregate()只需要将某些东西计算为不同值的函数MONTH-YEAR.在这种情况下,我用作VALUE计算的东西:

aggregate(cbind(count = VALUE) ~ MONTH.YEAR, 
          data = mydf, 
          FUN = function(x){NROW(x)})
Run Code Online (Sandbox Code Playgroud)

哪个给你..

  MONTH.YEAR count
1  FEB. 2012     2
2  JAN. 2012     2
3  MAR. 2012     1
Run Code Online (Sandbox Code Playgroud)

  • 我认为`FUN = function(x){NROW(x)}`可以被`NROW`或`length`代替。 (2认同)

小智 7

尝试在dplyr中使用count函数:

library(dplyr)
dat1_frame %>% 
    count(MONTH.YEAR)
Run Code Online (Sandbox Code Playgroud)

我不确定你是如何将MONTH-YEAR作为变量名称的.我的R版本不允许这样的变量名,所以我用MONTH.YEAR替换它.

作为旁注,代码中的错误是dat1_frame %.% group_by(MONTH-YEAR)没有summarise函数返回原始数据框而没有任何修改.所以,你想要使用

dat1_frame %>%
    group_by(MONTH.YEAR) %>%
    summarise(count=n())
Run Code Online (Sandbox Code Playgroud)


won*_*782 5

library(plyr)
ddply(data, .(MONTH-YEAR), nrow)
Run Code Online (Sandbox Code Playgroud)

如果"MONTH-YEAR"是一个变量,这将给你答案.首先,尝试唯一(数据$ MONTH-YEAR)并查看它是否返回唯一值(无重复项).

然后上面简单的split-apply-combine将返回你想要的东西.


Use*_*321 5

只是为了完成 data.table 解决方案:

library(data.table)

mydf <- structure(list(ID = c(110L, 111L, 121L, 131L, 141L), 
                       MONTH.YEAR = c("JAN. 2012", "JAN. 2012", 
                                      "FEB. 2012", "FEB. 2012", 
                                      "MAR. 2012"), 
                       VALUE = c(1000L, 2000L, 3000L, 4000L, 5000L)), 
                  .Names = c("ID", "MONTH.YEAR", "VALUE"), 
                  class = "data.frame", row.names = c(NA, -5L))

setDT(mydf)
mydf[, .(`Number of rows` = .N), by = MONTH.YEAR]

   MONTH.YEAR Number of rows
1:  JAN. 2012              2
2:  FEB. 2012              2
3:  MAR. 2012              1
Run Code Online (Sandbox Code Playgroud)