2014-09-03 49 views
1

我有这两列的DF:P_ID和PR_ID。每行都有重复的行,有些P_ID具有多个PR_ID,反之亦然。 重复的例子:为重复组值的计数添加新列

DF <- data.frame(
    'p_id' = sample(100:300, 100, replace=T), 
    'pr_id' = sample(100:300, 100, replace=T) 
) 

我想一个新列pr_count到DF的基础上增加多少pr_id有每个的p_id。

在实践中的一些p_ids的没有任何pr_id。我希望他们的pr_count为0。

所需的输出格式:

p_id pr_id  pr_count 
---- ----  -------- 
1  2    0 
+0

我更新,它包含理想的输出格式。谢谢你的提议.seed – Kash 2014-09-03 09:39:29

回答

1

数字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_idNA。默认情况下,ave()只会复制pr_id的值,无论p_idNA

的通用解决方案

你必须记住,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不会以数据框的形式存储!

+0

似乎工作得很好,谢谢! – Kash 2014-09-03 14:17:03

0

尝试:

'p_id' = sample(100:300, 10, replace=T) 
'pr_id' = sample(100:300, 10, replace=T) 

DF <- data.frame(p_id, pr_id) 
outdf = expand.grid(p_id, pr_id) 
outdf$count = ifelse(outdf$Var1==p_id & outdf$Var2==pr_id, 1, 0) 
names(outdf)= c("p_id","pr_id","count") 

head(outdf) 
    p_id pr_id count 
1 295 193  1 
2 112 193  0 
3 283 193  0 
4 163 193  0 
5 202 193  0 
6 135 193  0 
+0

这与OP请求的输出相差很远。这些不是计数,而是新数据框中的1/0指标,它比原始数据集大。 – 2014-09-03 11:47:17