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

transmute_at specified column numbers using case_when(grepl()) for multiple arguments

我一直在寻找这个问题的解决方案,但没有成功。我有一个鱼类数据框,我需要在 27 列数据上应用 dplyr window 函数 (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)
)

我需要使用填充有普通鱼的列 codes/names (NP, OM, suck) 计算前四列中的表达式并输出如果满足表达式,则基于每一列的不同数字。到目前为止,我只能弄清楚如何将一列的内容设为 运行。如何为将创建的新列 transmute 和用于计算每个表达式的列在 transmute_at 中索引列名。

这适用于一列:

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"
  )
)

提前致谢!

如果我对你的问题的理解正确,你可以执行以下操作。 transmute 类似于 mutate。不同之处在于 transmute 删除了其他变量。 transmute_attransmute 的变体,它有三个参数。第一个参数是 tbldata frame。第二个参数 .vars 是 select 列的位置。我们可以使用 vars(...) 来指定列,其中 ... 可以使用与 dplyr::select 相同的方法。第三个参数 .funs 是指定函数以应用于所有 selected 列的地方。我们把操作放在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