我有一个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
执行此任务。)
答案 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()