使用dplyr' mutate()函数在sum()函数内使用列

时间:2014-10-05 08:34:37

标签: r sum dataframe probability dplyr

我有一个数据框,我想使用dplyr的mutate()函数创建一个新列probprob应包括概率P(行值>所有列值),在数据帧中存在比每行值更大的行。这就是我想要做的事情:

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。如果我将value替换为表达式2中的sum(value < data$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()函数内的参数。

2 个答案:

答案 0 :(得分:4)

将agstudy的代码改编成dplyr:

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

答案 1 :(得分: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