基于重复行的两列计算唯一值,R数据帧
我有一个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
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
都不起作用。@ShanZhengYangrle
返回具有$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]