【问题标题】:iterate repetitive operation of columns of certain class迭代某类列的重复操作
【发布时间】:2019-07-09 00:03:44
【问题描述】:

对某个类的变量进行重复操作(简单算术)并返回新值,代码简洁。

我尝试编写一个 for 循环并使用 dplyr case_when 进行操作。该操作是将数字列除以特定的数字列,并返回带有操作结果的新的附加列。我有以下虚拟数据和代码:

 Sp<-   c('ALF-01', 'AMB-01')
 norWT<-    c(4,    74.25)
 stateWT<-  c(4,    74.25)
 avWT<- c(1.1,  3.4)
 t<-data.frame(Sp, norWT, stateWT, avWT)

我想将两个数字列(norwt、stateWt)除以 avWT 尝试了以下for循环

output <- vector("double", ncol(t))  
for (i in seq_along(t)) {            
  output[[i]] <-(t, class =='numeric')[[i]]/avWT      
}
output

只是返回错误

预期的结果应该是这样的:

    Sp1     norWT1  stateWT1 avWT1  norWT_avWT1     stateWT_avWT1
    ALF-01  4.00    4.00    1.1     3.636364        3.636364
    AMB-01  74.25   74.25   3.4     21.838235       21.838235

很高兴看到 for 循环和 dplyr (mutate/case_when) 解决方案。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以使用mutate_at来划分特定的列

    library(dplyr)
    
    t %>% mutate_at(vars(norWT, stateWT),list(avWT1 = ~./avWT))
    
    #     Sp norWT stateWT avWT norWT_avWT1 stateWT_avWT1
    #1 ALF-01  4.00    4.00  1.1    3.636364      3.636364
    #2 AMB-01 74.25   74.25  3.4   21.838235     21.838235
    

    使用基础 R,您也可以直接执行此操作。

    cols <- c("norWT", "stateWT")
    t[paste0(cols, "_avWT1")] <- t[cols]/t$avWT
    

    另外,t 是 R 中函数的名称,因此最好为数据框使用其他名称。


    如果有更多的列,我们只需要对数字列进行操作,我们可以使用mutate_if

    t %>%
      mutate_if(is.numeric, list(avWT1 = ~./avWT)) %>%
      select(-avWT_avWT1)
    

    【讨论】:

    • 谢谢。您是否也可以发布一个 for 循环示例,只是为了让我了解它。干杯
    • 再次感谢@ronak。在我的真实数据情况下,如果我调用类 numeric 会很有用,因为数据框中有很多变量列。干杯
    • 您可以找到所有带有 colnames(t)[sapply(t, is.numeric)] 之类的数字列名称(您必须以某种方式排除 avWT,因为这也是一个数字列)
    • @Tom 你也可以使用mutate_ift %&gt;% mutate_if(is.numeric,list(avWT1 = ~./avWT)),但这会给你一个额外的带有avWT的列,你可能想忽略它。
    【解决方案2】:

    data.table 我们可以做到

    library(data.table)
    nm1 <- c("norWT", "stateWT")
    setDT(t)[,  paste0(nm1, "_avWT1") := lapply(.SD, `/`, avWT), .SDcols = nm1]
    t
    #        Sp norWT stateWT avWT norWT_avWT1 stateWT_avWT1
    #1: ALF-01  4.00    4.00  1.1    3.636364      3.636364
    #2: AMB-01 74.25   74.25  3.4   21.838235     21.838235
    

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2015-07-30
      • 2015-11-10
      • 2020-01-05
      相关资源
      最近更新 更多