基于重复行的两列计算唯一值,R数据帧

基于重复行的两列计算唯一值,R数据帧,r,dataframe,count,data.table,R,Dataframe,Count,Data.table,我有一个R数据帧,格式如下: column1 column2 NA NA 1 A 1 A 1 A NA NA NA NA 2 B 2 B NA NA NA NA 3 A 3 A 3 A df = structure(list(column1 = c(NA, 1L, 1

我有一个R数据帧,格式如下:

column1    column2
NA         NA
1          A
1          A
1          A
NA         NA
NA         NA
2          B
2          B
NA         NA
NA         NA
3          A
3          A
3          A

df = structure(list(column1 = c(NA, 1L, 1L, 1L, NA, NA, 2L, 2L, NA, 
NA, 3L, 3L, 3L), column2 = c(NA, "A", "A", "A", NA, NA, "B", 
"B", NA, NA, "A", "A", "A")), .Names = c("column1", "column2"
), row.names = c(NA, -13L), class = "data.frame")
如果一列中的行具有
NA
,则另一列具有
NA
column1
中的数值描述了一个唯一的组,例如,第2-4行具有组
1
。列
column2
描述了此分组的标识。在此数据帧中,标识为
A
B
C
D

我的目标是在整个数据框架内按组统计身份的数量:A组有多少,B组有多少,等等

该文件的正确输出(到目前为止)是有2个A组和1个B组

我该怎么计算呢

目前,我会尝试以下方法:

length(df[df$column2 == "B"]) ## outputs 2 
但这是不正确的。如果我将
column1
column2
组合起来,只取唯一的值1A、2B、3A,我想我可以计算出
column2
中的每个标签出现了多少次


(如果更简单,我很乐意使用
data.table
完成此任务。)

您可以使用
rle
进行运行,使用
table
进行制表:

table(rle(df$column2)$values)

# A B 
# 2 1 
有关详细信息,请参见
?rle

或者,如果您想利用
column1
(源自
column2
):


“dplyr”包为此提供了简单的功能

library(dplyr)

df %>%
  filter(complete.cases(.) & !duplicated(.)) %>% 
  group_by(column2) %>%
  summarize(count = n())
  • 用NA过滤掉行
  • 过滤掉重复的行;这些代表同一群体中的个人
  • 按标识变量分组(第2列)
  • 计算唯一组的数量(第1列)

  • 如果要使用data.table:

    library(data.table)
    setDT(df)
    
    d <- df[!is.na(column1), list(n=.N), by=list(column2,column1)]
    d <- d[, list(n=.N), by=list(column2)]
    d
       column2 n
    1:       A 2
    2:       B 1
    

    我认为,总结n()的分组可以缩短为计数或计数。或者缩短到
    df%>%distinct%>%count(第2列)
    可能。谢谢。我正在努力学习如何访问此表的值
    (表(rle(df$column2)$values))$values
    (表(rle(df$column2)$values))$A
    都不起作用。@ShanZhengYang
    rle
    返回具有$values和$LENGS的对象,但大多数R对象都没有这种结构。如果你做了
    res
    
    library(data.table)
    setDT(df)
    
    d <- df[!is.na(column1), list(n=.N), by=list(column2,column1)]
    d <- d[, list(n=.N), by=list(column2)]
    d
       column2 n
    1:       A 2
    2:       B 1
    
    setDT(df)[!is.na(column1), .N, by = .(column2, column1)][, .N, by = column2]