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

时间:2017-04-11 19:45:17

标签: 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, 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,则另一列有NAcolumn1中的数值描述了一个唯一的组,例如第2-4行包含组1。列column2描述了此分组的标识。在此数据框中,标识为ABCD

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

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

我该如何计算?

目前,我会尝试这样的事情:

length(df[df$column2 == "B"]) ## outputs 2 

但这是不正确的。如果我合并column1column2,只取得唯一值1A,2B,3A,我想我可以计算column2的每个标签出现多少次?

(如果更容易,我很乐意使用data.table执行此任务。)

3 个答案:

答案 0 :(得分:4)

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

table(rle(df$column2)$values)

# A B 
# 2 1 

有关详细信息,请参阅?rle?table

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

table(unique(df)$column2)

答案 1 :(得分:4)

如果您想使用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

或者更简洁地作为一个单行:

setDT(df)[!is.na(column1), .N, by = .(column2, column1)][, .N, by = column2]

答案 2 :(得分:3)

'dplyr'包具有简单的功能

webdriver.Key.chord()
  1. 过滤出NA
  2. 的行
  3. 过滤掉重复的行;这些代表同一群体中的个人
  4. 按标识变量(column2)分组
  5. 计算唯一组的数量(column1)