【问题标题】:divide a column of lists by numbers in another column将一列列表除以另一列中的数字
【发布时间】:2021-11-04 18:40:23
【问题描述】:

您好,我有这个数据框 (test),我想将列表 (AO) 中的每个元素除以另一列 (DP) 中的值:

df <- structure(list(DP = c("572", "594", "625", "594", "537", "513"
), AO2 = list(list(c(2, 2)), list(c(2, 2, 2)), list(c(4, 4)), 
    list(c(3, 2, 2, 2, 3)), list(c(2, 2)), list(c(2, 2)))), row.names = c(NA, 
-6L), class = c("data.table", 
"data.frame"))

df

我想在df 中创建一个新列,其中列表的每个值都除以同一行的df$DP 中的值。

我曾尝试使用 mapply,但没有成功。有什么想法吗?

test$AO2_DP <- mapply(FUN = `/`, list(as.numeric(unlist(test$AO2))), as.numeric(test$DP), SIMPLIFY = FALSE)

【问题讨论】:

  • 请与dput分享您的数据样本

标签: r apply lapply


【解决方案1】:

使用Map 的基本 R 选项 -

df$result <- Map(`/`, unlist(df$AO2, recursive = FALSE),df$DP)
df

#    DP       AO2                                                      result
#1: 572 <list[1]>                                     0.003496503,0.003496503
#2: 594 <list[1]>                         0.003367003,0.003367003,0.003367003
#3: 625 <list[1]>                                               0.0064,0.0064
#4: 594 <list[1]> 0.005050505,0.003367003,0.003367003,0.003367003,0.005050505
#5: 537 <list[1]>                                     0.003724395,0.003724395
#6: 513 <list[1]>                                     0.003898635,0.003898635

如果DP 值是真实数据中的字符,请先将其转换为数字,然后由df$DP &lt;- as.numeric(df$DP) 应用答案。

【讨论】:

    【解决方案2】:

    由于列表列可以嵌套,您可以使用rapply 转到每个元素并进行划分。

    df$AO2_DP <- Map(function(x, y) rapply(x, function(z) z/y, how="replace"),
       df$AO2, as.numeric(df$DP))
    
    df
    #   DP           AO2                                                          AO2_DP
    #1 572          2, 2                                        0.003496503, 0.003496503
    #2 594       2, 2, 2                           0.003367003, 0.003367003, 0.003367003
    #3 625          4, 4                                                  0.0064, 0.0064
    #4 594 3, 2, 2, 2, 3 0.005050505, 0.003367003, 0.003367003, 0.003367003, 0.005050505
    #5 537          2, 2                                        0.003724395, 0.003724395
    #6 513          2, 2                                        0.003898635, 0.003898635
    

    【讨论】:

      【解决方案3】:

      也许rowwisesapply 会有所帮助

      test %>%
        rowwise() %>%
        mutate(DP = as.numeric(DP)) %>%
        mutate(AO2_DP = list(sapply(AO2, function(x) x/DP)))
      

      【讨论】:

        【解决方案4】:

        这是dplyr 解决方案,使用您的原始想法但已修改

        library(dplyr)
        
        df %>% 
          rowwise() %>% 
          mutate(AO2_DP = list(mapply(FUN = "/", list(as.numeric(unlist(AO2))), as.numeric(DP), SIMPLIFY = FALSE))) %>% 
          as.data.frame()
        #>    DP           AO2
        #> 1 572          2, 2
        #> 2 594       2, 2, 2
        #> 3 625          4, 4
        #> 4 594 3, 2, 2, 2, 3
        #> 5 537          2, 2
        #> 6 513          2, 2
        #>                                                            AO2_DP
        #> 1                                        0.003496503, 0.003496503
        #> 2                           0.003367003, 0.003367003, 0.003367003
        #> 3                                                  0.0064, 0.0064
        #> 4 0.005050505, 0.003367003, 0.003367003, 0.003367003, 0.005050505
        #> 5                                        0.003724395, 0.003724395
        #> 6                                        0.003898635, 0.003898635
        

        我在您的mapply()FUN 中添加了一个引号,然后我使用rowwise() 执行逐行操作。

        【讨论】:

          【解决方案5】:
          df %>%
            unnest(AO2) %>%
            mutate(DP = as.numeric(DP),
                   res = map2(.x = AO2, .y = DP, .f = ~ .x / .y))
          

          【讨论】:

            【解决方案6】:

            你可以试试下面的代码

            transform(
              df,
              AO2_DP = Map("/", unlist(AO2, recursive = FALSE), as.numeric(DP))
            )
            

            给了

                DP       AO2                                                      AO2_DP
            1: 572 <list[1]>                                     0.003496503,0.003496503
            2: 594 <list[1]>                         0.003367003,0.003367003,0.003367003
            3: 625 <list[1]>                                               0.0064,0.0064
            4: 594 <list[1]> 0.005050505,0.003367003,0.003367003,0.003367003,0.005050505
            5: 537 <list[1]>                                     0.003724395,0.003724395
            6: 513 <list[1]>                                     0.003898635,0.003898635
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-01-05
              • 1970-01-01
              • 1970-01-01
              • 2017-03-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多