transmute_at使用case_when(grepl())为多个参数指定列号

时间:2017-12-15 03:48:04

标签: r dplyr tidyverse

我一直在寻找解决这个问题的方法,但没有运气。我有一个鱼类数据框,我需要在27列数据上应用 dplyr 窗口函数(transmute_at)。数据框子集:

df <- data.frame(
  Otherspp = c("suck SD", "BT", "SD RS", "RSS"),
  Dominantspp = c("OM", "OM", "RS", "CH"),
  Commonspp = c(" ", " ", " ", "OM"),
  Rarespp = c(" ", " ", "SD", "NP"),
  NP = rep("northern pikeminnow|NORTHERN PIKEMINNOW|np|NP|npm|NPM", 4),
  OM = rep("steelhead|STEELHEAD|rainbow trout|RAINBOW TROUT|st|ST|rb|RB|om|OM", 4),
  suck = rep("suckers|SUCKERS|sucker|SUCKER|suck|SUCK|su|SU", 4)
)

我需要使用填充了常见鱼码/名称(NPOMsuck)的列来评估前四列中的表达式并输出不同的数字,如果满足表达式,则基于每个列。到目前为止,我只能弄清楚如何让它运行一列。如何在transmute_at中为新列transmute创建的列和用于评估每个表达式的列索引列名。

这适用于一列:

df <- subset(df[, c(1:4, 6)]) # using column OM for best example

df %>%
  rowwise() %>%
  transmute(OM = case_when(
    grepl(OM, Dominantspp) ~ "5",
    grepl(OM, Commonspp) ~ "3",
    grepl(OM, Rarespp) ~ "1",
    grepl(OM, Otherspp) ~ "1",
    TRUE ~ "0"
  )
)

提前致谢!

1 个答案:

答案 0 :(得分:4)

如果我理解你的问题,这就是你能做的。 transmutemutate类似。差异是transmute丢弃其他变量。 transmute_attransmute的变体,有三个参数。第一个参数是tbldata frame。第二个参数.vars是一个选择列的位置。我们可以使用vars(...)来指定...可以使用与dplyr::select相同的方法的列。第三个参数.funs是指定要应用于所有选定列的函数的位置。我们将操作设为funs(...)

library(dplyr)

df %>%
  rowwise() %>%
  transmute_at(vars(NP, OM, suck), 
               funs(Recode = case_when(
                 grepl(., Dominantspp) ~ "5",
                 grepl(., Commonspp) ~ "3",
                 grepl(., Rarespp) ~ "1",
                 grepl(., Otherspp) ~ "1",
                 TRUE ~ "0"))) %>%
  ungroup()
# # A tibble: 4 x 3
#   NP_Recode OM_Recode suck_Recode
#       <chr>     <chr>       <chr>
# 1         0         5           1
# 2         0         5           0
# 3         0         0           0
# 4         1         3           0

或者像这样,原始列名后面没有任何标签。

df %>%
  rowwise() %>%
  transmute_at(vars(NP, OM, suck), 
               funs(case_when(
                 grepl(., Dominantspp) ~ "5",
                 grepl(., Commonspp) ~ "3",
                 grepl(., Rarespp) ~ "1",
                 grepl(., Otherspp) ~ "1",
                 TRUE ~ "0"))) %>%
  ungroup()
# # A tibble: 4 x 3
#      NP    OM  suck
#   <chr> <chr> <chr>
# 1     0     5     1
# 2     0     5     0
# 3     0     0     0
# 4     1     3     0