我有一个数据框,我想使用dplyr的mutate()函数创建一个新列prob
。 prob
应包括概率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()
函数内的参数。
答案 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