这是与此问题类似的主题: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))
但我不知道如何将其合并以解决这个问题。
我将不胜感激任何建议。谢谢。
答案 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)))))