2014-10-05 50 views
2

我有一个数据框,我想用dplyr的mutate()函数创建一个新列probprob应包含概率P(行值>所有列值),表示数据框中行数比每行的值大。这是我想做的事:在sum()函数中使用dplyr的mutate()函数使用列函数

data = data.frame(value = c(1,2,3,3,4,4,4,5,5,6,7,8,8,8,8,8,9)) 

require(dplyr) 

data %>% mutate(prob = sum(value < data$value)/nrow(data)) 

这得出以下结果:

value prob 
1  1 0 
2  2 0 
3  3 0 
4  3 0 
... ... ... 

这里prob只包含0的每一行。如果我在表达sum(value < data$value)2替换value

data %>% mutate(prob = sum(2 < data$value)/nrow(data)) 

我得到以下的结果:

value  prob 
1  1 0.8823529 
2  2 0.8823529 
3  3 0.8823529 
4  3 0.8823529 
... ... ... 

0.8823529的概率是有在数据帧大于2值的行。问题似乎是mutate()函数不接受value列作为sum()函数中的参数。

+0

'mutate'? 'dplyr'?你想要'sapply(data $ value,function(x)sum(x agstudy 2014-10-05 08:52:36

+0

谢谢!保持简单 - 好主意...... – Simen 2014-10-05 09:01:34

+1

@Simen,你可以调整agstudy的代码到dplyr:data%>%mutate(prob = sapply(value,function(x)sum(x KFB 2014-10-05 11:56:48

回答

4

适应agstudy代码比特到dplyr:

data %>% mutate(prob = sapply(value, function(x) sum(x < value)/nrow(data))) 
+2

可以通过使用'mean() – hadley 2014-10-09 11:49:41

0

我认为一个基本的vapply(或sapply)将使更多的意义在这里。然而,如果你真的想走景区路线,你可以尝试这样的事情:

data = data.frame(value = c(1,2,3,3,4,4,4,5,5,6,7,8,8,8,8,8,9)) 

data %>% 
    rowwise() %>%    ## You are really working by rows here 
    do(prob = sum(.$value < data$value)/nrow(data)) %>% 
    mutate(prob = c(prob)) %>% ## The previous value was a list -- unlist here 
    cbind(data)     ## and combine with the original data 
#   prob value 
# 1 0.94117647  1 
# 2 0.88235294  2 
# 3 0.76470588  3 
# 4 0.76470588  3 
# 5 0.58823529  4 
# 6 0.58823529  4 
# 7 0.58823529  4 
# 8 0.47058824  5 
# 9 0.47058824  5 
# 10 0.41176471  6 
# 11 0.35294118  7 
# 12 0.05882353  8 
# 13 0.05882353  8 
# 14 0.05882353  8 
# 15 0.05882353  8 
# 16 0.05882353  8 
# 17 0.00000000  9