【问题标题】:transmute_at specified column numbers using case_when(grepl()) for multiple argumentstransmute_at 使用 case_when(grepl()) 为多个参数指定列号
【发布时间】:2017-12-15 19:12:22
【问题描述】:

我一直在寻找解决此问题的方法,但没有成功。我有一个鱼类数据框,我需要在 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 和用于评估每个表达式的列索引 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"
  )
)

提前致谢!

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

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

    【讨论】:

    • transmute_at 如何在这里工作。我试图用谷歌搜索它,但找不到太多关于它的信息。请解释一下。
    • @PIG 感谢您的评论。请查看我更新的帖子。
    • @www 感谢您回答我的问题。我可以让可重现的示例正常工作,但是当我尝试将代码应用于我的更大数据集时,我收到此错误:“mutate_impl(.data, dots) 中的错误:评估错误:需要 TRUE/FALSE 的地方缺少值。”
    • 帮不上忙。请比较您的可重现示例和您的真实世界数据集,看看它们之间有什么区别。
    • 没关系,代码有效。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2021-02-24
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    相关资源
    最近更新 更多