在R中:创建一个新列,计算值在一列中出现的次数,但不包括另一列中的NA值

时间:2014-11-11 21:51:32

标签: r dataframe

这是与此问题类似的主题:Using R: Make a new column that counts the number of times 'n' conditions from 'n' other columns occur

但我需要让它更复杂。

示例数据:

id  group_name
01  NA
02  NA
03  groupA
03  groupB
04  groupF
05  groupA
05  groupX
06  NA

我想在数据框中附加一个新列“num_groups”。 “Num_groups”应包括每个“id”所属的组的总数。 “group_name”中的NA表示“id”属于0组。

所以,它应该是这样的:

id  group_name  num_groups
01  NA          0
02  NA          0
03  groupA      2
03  groupB      2
04  groupF      1
05  groupA      2
05  groupX      2
06  NA          0

我已经能够使用以下代码创建一个新列,其中包含每个id在“id”中列出的次数:

MyDF <- cbind(MyDF, num_groups = c(1:210))
MyDF$num_groups <- as.numeric(ave(MyDF$id, MyDF$id, FUN = length))

但如果“group_name”为NA,我无法弄清楚如何使“num_groups”中的值为0。我还探讨了使用which(),

which(is.na(MyDF$group_name))

但我不知道如何将其合并以解决这个问题。

我将不胜感激任何建议。谢谢。

3 个答案:

答案 0 :(得分:1)

尝试:

library(data.table)
# assume df is your data.frame
setDT(df)[, num_groups := .N, by=id][is.na(group_name), num_groups := 0]
df
   id group_name num_groups
1:  1         NA          0
2:  2         NA          0
3:  3     groupA          2
4:  3     groupB          2
5:  4     groupF          1
6:  5     groupA          2
7:  5     groupX          2
8:  6         NA          0

答案 1 :(得分:0)

这个怎么样?

tbl <- table(df$id)

df$num_groups <- tbl[match(df$id, names(tbl))]

df$num_groups[is.na(df$group_name)] <- 0

df
 id group_name num_groups
 1  1       <NA>          0
 2  2       <NA>          0
 3  3     groupA          2
 4  3     groupB          2
 5  4     groupF          1
 6  5     groupA          2
 7  5     groupX          2
 8  6       <NA>          0

答案 2 :(得分:0)

我最喜欢你原来的答案,但修好了:

as.numeric(ave(MyDF$group_name, MyDF$id, FUN = function(x) length(na.omit(x))))

或者如果您想要唯一的群组,可以轻松添加:

as.numeric(ave(MyDF$group_name, MyDF$id, FUN = function(x) length(unique(na.omit(x)))))