【问题标题】:Use of column inside sum() function using dplyr's mutate() function使用 dplyr 的 mutate() 函数在 sum() 函数中使用列
【发布时间】:2014-11-29 19:29:56
【问题描述】:

我有一个数据框,我想使用 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。如果我在表达式sum(value &lt; data$value) 中将value 替换为2

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() 函数内的参数。

【问题讨论】:

  • mutate ? dplyr?你想要sapply(data$value,function(x)sum(x &lt; data$value) / nrow(data))?
  • 谢谢!保持简单——好主意……
  • @Simen,您可以将 agstudy 的代码稍微修改为 dplyr:data %>% mutate(prob = sapply(value, function(x) sum(x
  • 如果它有效,它可能就是答案。您能否检查/勾选答案以结案? :)

标签: r sum dataframe probability dplyr


【解决方案1】:

将 agstudy 的代码稍微修改为 dplyr:

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

【讨论】:

  • 可以通过使用mean()来简化一点
【解决方案2】:

我认为基本的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多