r - 如何使用 dplyr 将函数逐行应用到数据框中,而不对列名称进行硬编码

标签 r dplyr tidyverse

我有以下数据框:

dat <- structure(list(setosa = c(50L, 0L, 0L), versicolor = c(0L, 11L, 
39L), virginica = c(0L, 36L, 14L)), .Names = c("setosa", "versicolor", 
"virginica"), row.names = c("1", "2", "3"), class = "data.frame")

dat
#>   setosa versicolor virginica
#> 1     50          0         0
#> 2      0         11        36
#> 3      0         39        14

这是我当前用于通过将列名称硬编码到其中来计算分数的代码:

library(dplyrj)
dat %>% 
  rowwise() %>% 
  # here I hard code the column names into the score
  mutate(score = max(c(setosa,versicolor, virginica)/ sum(c(setosa, versicolor, virginica))))

产生:

# A tibble: 3 x 4
  setosa versicolor virginica score
   <int>      <int>     <int> <dbl>
1     50          0         0 1.00 
2      0         11        36 0.766
3      0         39        14 0.736

我想要做的是计算每个分数,但不硬编码列名称。

如何实现这一目标?

最佳答案

一个简洁的base R选项是

dat$score <- do.call(pmax, dat)/rowSums(dat)

tidyverse 中我们可以做到

library(tidyverse)
dat %>% 
    mutate(score = do.call(pmax, .)/reduce(., `+`))
#   setosa versicolor virginica     score
#1     50          0         0 1.0000000
#2      0         11        36 0.7659574
#3      0         39        14 0.7358491

关于r - 如何使用 dplyr 将函数逐行应用到数据框中,而不对列名称进行硬编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49251057/

相关文章:

r - 使用 dplyr::filter,如何将输出限制为前 500 行?

r - 根据另一个变量选择分组行

R 如何在给定起点和终点的 Tibble 中生成序列

r - 使用某些行作为分组新列中的值(从 excel 导入的数据)

r - 查找小于特定值的向量中的最大数

R:y 轴上带有分钟和秒的箱线图

r - 将共现数据帧转换为方阵

r - Ubuntu集群管理

r - 如何加速 `dplyr::mutate()` 中的空间操作?

重命名数据框的列