数字ID值
为此,ave()
是你要找的主力。就拿一些的p_id的数据帧没有pr_id反之亦然:
DF <- data.frame(
'p_id' = sample(100:300, 100, replace=T),
'pr_id' = sample(100:300, 100, replace=T)
)
DF$pr_id[sample(1:100,10)] <- NA
DF$p_id[sample(1:100,10)] <- NA
使用ave()
创建矢量pr_count
DF <- within(DF,{
pr_count <- ave(pr_id,p_id,
FUN = function(x)length(na.omit(x))
)
pr_count[is.na(p_id)] <- 0
})
请注意,您在pr_count
何时更换值p_id
是NA
。默认情况下,ave()
只会复制pr_id
的值,无论p_id
是NA
。
的通用解决方案
你必须记住,ave()
将创建一个具有相同类型为初始x
参数(在这种情况下,pr_id
)的向量。所以,如果你有个性的ID,你需要转换为数字在年底还有:
DF <- data.frame(
'p_id' = sample(letters, 100, replace=T),
'pr_id' = sample(LETTERS, 100, replace=T),
stringsAsFactors = FALSE
)
DF$pr_id[sample(1:100,10)] <- NA
DF$p_id[sample(1:100,10)] <- NA
DF <- within(DF,{
pr_count <- ave(pr_id,p_id,
FUN = function(x)length(na.omit(x))
)
pr_count[is.na(p_id)] <- 0
pr_count <- as.numeric(pr_count)
})
再次得到期望的结果:
> str(DF)
'data.frame': 100 obs. of 3 variables:
$ p_id : chr "m" "f" "u" "n" ...
$ pr_id : chr "Y" "W" "R" "M" ...
$ pr_count: num 2 2 3 2 2 2 2 5 4 2 ...
警告的ave()
这种行为也意味着,你会因为一些因素而遇到一些麻烦。在使用这个之前,请确保您的ID不会以数据框的形式存储!
我更新,它包含理想的输出格式。谢谢你的提议.seed – Kash 2014-09-03 09:39:29