【问题标题】:Compare the names of vectors and select the common ones and sum the values比较向量的名称并选择常见的并将值相加
【发布时间】:2018-11-26 04:08:56
【问题描述】:

我正在尝试在三个带名称的向量中查找通用名称。我想在这三个向量中找到通用名称,并对这些通用命名向量的值进行计数(或求和)。

例如:

vec1<- c(1:20)
names(vec1) = c( "X13" , "X25", "X58", "X79", "X95" , "X118", "X212", "X311",    
            "X422" , "X536", "X899", "X1005","X1080" , "X1118", "X1322", "X1516","X1705" 
            , "X1890", "X1925", "X2008")
vec2<- c(21:40)
names(vec2) = c( "X11" , "X25", "X58", "X79", "X119" , "X120", "X212", "X311",    
            "X422" , "X536", "X899", "X995","X1080" , "X1098", "X1322", "X1516","X1705" 
            , "X1890", "X1930", "X2008")

vec3<- c(41:60)
names(vec3) = c( "X13" , "X25", "X58", "X79", "X95" , "X118", "X212", "X311",    
            "X422" , "X536", "X899", "X1005","X1080" , "X1118", "X1322", "X1516","X1705" 
            , "X1890", "X1925", "X2010")

在上面的示例中,在 vec1、vec2 和 vec3 中,“x25”是通用名称,其值为 2,22 和 42。因此输出应具有值为 66 的 x25 (2+22+42= 66)。

此外,“x13”存在于 vec1 和 vec3 中,但不存在于 vec2 中。所以应该忽略。

我尝试使用 is.equal 但出现错误。

【问题讨论】:

    标签: r vector


    【解决方案1】:

    我们可以使用Reduceintersect 来找出所有向量之间的通用名称,然后从所有向量中对它们进行子集化并添加它们。

    common_names <- Reduce(intersect, list(names(vec1), names(vec2), names(vec3)))
    
    vec1[common_names] + vec2[common_names] + vec3[common_names]    
    
    #  X25   X58   X79  X212  X311  X422  X536  X899 X1080 X1322 X1516 X1705 X1890 
    #   66    69    72    81    84    87    90    93    99   105   108   111   114    
    

    【讨论】:

      【解决方案2】:

      这是tidyverse的选项

      library(tidyverse)
      list(vec1, vec2, vec3) %>% 
         map_df(enframe, .id = 'vec') %>% 
         group_by(name) %>% 
         filter(n_distinct(vec) == 3) %>%
         summarise(value = sum(value))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-12
        • 2013-02-19
        • 1970-01-01
        • 2016-12-19
        • 2011-09-16
        相关资源
        最近更新 更多