【问题标题】:summing up the first 5 elements of a list总结列表的前 5 个元素
【发布时间】:2020-04-16 02:22:22
【问题描述】:

我有一个数据框,其中包含具有不同数量整数值的列。我需要取其中的前五个值并将它们总结起来。我找到了一种方法,但似乎无法将其概括为循环遍历所有内容:

这是第一个元素的代码:

results$occupied[1] %>%
  strsplit(",") %>%
  as.list() %>%
  unlist() %>%
  head(5) %>%
  as.numeric() %>%
  sum()

什么不适用于所有元素:

results %>%
  rowwise() %>%
  select(occupied) %>%
  as.character() %>%
  strsplit(",") %>%
  as.list() %>%
  unlist() %>%
  head(5) %>%
  as.numeric() %>%
  sum()

【问题讨论】:

    标签: r dplyr pipe


    【解决方案1】:

    在base R中,你可以这样做:

    sapply(strsplit(results$occupied, ","), function(x) sum(as.numeric(head(x, 5))))
    

    或者使用dplyrpurrr

    library(dplyr)
    library(purrr)
    
    results %>%
        mutate(total_sum = map_dbl(strsplit(occupied, ","), 
                            ~sum(as.numeric(head(.x, 5)))))
    

    同样,使用 rowwise :

    results %>%
       rowwise() %>%
       mutate(total_sum = sum(as.numeric(head(strsplit(occupied, ",")[[1]], 5))))
    

    【讨论】:

    • 精彩的答案!
    【解决方案2】:

    我们可以使用separate_rows拆分“占用”列并展开行,然后按行号进行分组,得到前五个元素的sum

    library(dplyr)
    library(tidyr)
    results %>%
       mutate(rn = row_number()) %>%
       separate_rows(occupied, convert = TRUE) %>%
       group_by(rn) %>%
       slice(seq_len(5)) %>%
       summmarise(total_sum = sum(occupied)) %>%
       select(-rn) %>%
       bind_cols(results, .)
    

    【讨论】:

      猜你喜欢
      • 2012-07-30
      • 2013-01-05
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      相关资源
      最近更新 更多