【问题标题】:How can I sum vectors nested in a column of a data frame?如何对嵌套在数据框列中的向量求和?
【发布时间】:2019-03-20 18:19:56
【问题描述】:

我有一个数据框,其中一列包含一个列表。我想将列表转换为数字并将这些值相加到一个新列中。每行都有一个带有如下向量的列:

c("47", "39", "1")

新列将包含这些数字的总和,如下所示:

List                  SumList
c("47", "39", "1")     87
c("11", "11")          22
c("1", "2")             3

我尝试了几种不同的方法,但似乎没有产生我需要的结果。

示例数据框:

DF <- structure(list(list = structure(list(c("47", "39", "1"), c("11", 
"11"), c("1", "2")))), class = "data.frame", row.names = c(NA, -3L))

【问题讨论】:

  • 仅供参考,包含重现示例数据的代码通常是个好主意。您的帖子已经过编辑,以包含任何人的最佳猜测,但我们无法确定它是否正确。
  • 道歉。下次会确保包括样品。

标签: r dataframe


【解决方案1】:

您可以使用 dplyr 函数 rowwise 和 mutate 完成您想要的。

例子:

library(dplyr)
df <- tibble(List = list(c("47", "39", "1"), c("11","11"), c("1","2"))) %>% 
  rowwise() %>% 
  mutate(SumList = sum(as.numeric(List)))

【讨论】:

    【解决方案2】:

    1) 假设数据框在Note末尾,试试下面的代码。没有使用任何包。

    transform(DF, sum = sapply(list, function(x) sum(as.numeric(x))))
    

    给予:

           list sum
    1 47, 39, 1  87
    2    11, 11  22
    3      1, 2   3
    

    2) 另一种方法是将DF 转换为长格式,然后将其相加得到相同的结果。同样没有使用任何包。

    long <- stack(setNames(DF$list, seq_along(DF$list)))
    transform(DF, sum = rowsum(as.numeric(long$value), long$ind))
    

    注意

    可重现形式的输入:

    DF <- structure(list(list = structure(list(c("47", "39", "1"), c("11", 
    "11"), c("1", "2")))), class = "data.frame", row.names = c(NA, -3L))
    

    【讨论】:

      【解决方案3】:

      这是一个使用map_dblpurrr 解决方案。

      library(dplyr)
      library(tibble)
      library(purrr)
      
      tibble(x = list(c("47", "39", "1"), c("11","11"), c("1","2"))) %>% 
        mutate(Sum = map_dbl(x, function(i)sum(as.numeric(i))))
      #> # A tibble: 3 x 2
      #>   x           Sum
      #>   <list>    <dbl>
      #> 1 <chr [3]>    87
      #> 2 <chr [2]>    22
      #> 3 <chr [2]>     3
      

      reprex package (v0.2.1) 于 2019-03-20 创建

      【讨论】:

        【解决方案4】:

        假设我们使用 G. Grothendieck 结构:

        DF <- structure(list(list = structure(list(c("47", "39", "1"), c("11", 
                                                                         "11"), c("1", "2")))), class = "data.frame", row.names = c(NA, -3L))
        
        DF$SumList <-lapply(1:nrow(DF), function(x) sum(as.double(unlist(DF$list[x]))))
        

        还有弗兰克的意见:

        DF$SumList <-lapply(1:nrow(DF), function(x) sum(as.double(DF$list[[x]])))
        

        【讨论】:

          猜你喜欢
          • 2021-09-23
          • 1970-01-01
          • 2021-09-06
          • 2018-03-12
          • 2021-03-29
          • 1970-01-01
          • 2022-09-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多