两列的频率将一列中的NA计为零频率

时间:2015-10-18 16:25:23

标签: r data.table frequency

第1部分我有以下数据表。我想创建一个新列,其中包含除id之外的任何样式值的每个NA的出现次数。主要问题是我不知道如何处理NA。目前,当NA出现时,我的频率为1.

id    style   
1     A    
1     A    
2     A    
2     B    
3     NA    
4     A    
4     C   
5     NA

我尝试使用以下内容,但仍会计算NA个值

dt[, allele_count := .N, by = list(pat_id, style)]

所需的数据表如下:

id    style   count
1     A       2
1     A       2
2     A       2
2     B       2
3     NA      0
4     A       4
4     B       4
4     B       4
4     C       4
5     NA      0

Part2 我还希望能够添加另一列,其中每个id的出现次数具有特定的样式值。

id    style   count2
1     A       2
1     A       2
2     A       1
2     B       1
3     NA      0
4     A       1
4     B       2
4     B       2
4     C       1
5     NA      0

红利问题:与第2部分中的id值相比,不会查看给定stylestyle的次数,你怎么能计算每个id不同 id style count3 1 A 1 1 A 1 2 A 2 2 B 2 3 NA 0 4 A 3 4 B 3 4 B 3 4 C 3 5 NA 0 值的数量,如下所示。

Self

2 个答案:

答案 0 :(得分:3)

这是一种可能性。基本上我们使用行子集来分配新列,然后将所有三个新列中的NA值替换为最后的零。

nna <- !is.na(dt$style) ## so we don't have to call it four times
dt[nna, count := .N, by = id][nna, count2 := .N, by = .(id, style)][
    nna, count3 := uniqueN(style), by = id][!nna, names(dt)[3:5] := 0L]

导致

   id style count count2 count3
1:  1     A     2      2      1
2:  1     A     2      2      1
3:  2     A     2      1      2
4:  2     B     2      1      2
5:  3    NA     0      0      0
6:  4     A     2      1      2
7:  4     C     2      1      2
8:  5    NA     0      0      0

或者您可以将其简化为以下内容,然后根据需要对列重新排序。

dt[nna, c("count", "count3") := .(.N, uniqueN(style)), by = id][
    nna, count2 := .N, by = .(id, style)][!nna, names(dt)[3:5] := 0L]

请注意,此方法与其他已发布的答案非常相似。我不确定这两个中哪一个是首选方法,行子集或if()语句。

答案 1 :(得分:2)

这是一个可能的解决方案:

library(data.table)

dt <- data.table(id=c(1,1,2,2,3,4,4,5),
                 style=c('A','A','A','B',NA,'A','C',NA))

# count = number of ids having ALL styles defined
dt[, count := if(any(is.na(style))) 0L else .N, by = id]
# count2 = number of id-style occurrences (0 if style = NA)
dt[, count2 := if(is.na(style)) 0L else .N, by = .(id, style)]


> dt
   id style count count2
1:  1     A     2      2
2:  1     A     2      2
3:  2     A     2      1
4:  2     B     2      1
5:  3    NA     0      0
6:  4     A     2      1
7:  4     C     2      1
8:  5    NA     0      0

<强>奖金:

dt[, count3 := uniqueN(na.omit(style)), by = id]

> dt
   id style count count2 count3
1:  1     A     2      2      1
2:  1     A     2      2      1
3:  2     A     2      1      2
4:  2     B     2      1      2
5:  3    NA     0      0      0
6:  4     A     2      1      2
7:  4     C     2      1      2
8:  5    NA     0      0      0