代码之家  ›  专栏  ›  技术社区  ›  meilirog

计算矩阵r中的元素

  •  1
  • meilirog  · 技术社区  · 6 年前

    还有一个问题要问你。如何从起始位置自动创建数据帧“结果”。

    例如:我必须选择其中包含元素“E3”的每一行,并总结相应的行数。

    我希望有一个像我的数据框“result”这样的结果。E3->100+200+300=600

    #starting position
    v1 <- c("E1","E2","E3")
    v2 <- c("E2","E3",NA)
    v3 <- c("E3","E5",NA)
    number <- c(100, 200, 300)
    test <- data.frame(cbind(v1,v2,v3,number))
    
    #result
    index <- c("E1","E2","E3","E5")
    total <- c(100, 300, 600, 300)
    result <- data.frame(cbind(index,total))
    

    谢谢:)

    3 回复  |  直到 6 年前
        1
  •  2
  •   Martin Schmelzer    6 年前

    尝试以下操作:

    library(tidyverse)
    test %>% 
      gather(key = "col", value = "val", -number) %>% 
      group_by(val) %>% 
      summarise_if(is.numeric, sum)
    
    
    # A tibble: 5 x 2
      val   number
      <chr>  <dbl>
    1 E1      100.
    2 E2      300.
    3 E3      600.
    4 E5      200.
    5 NA      600.
    
        2
  •  1
  •   jogo    6 年前

    下面是一个带base的解决方案 R :

    M <- cbind(v1=c("E1","E2","E3"),
               v2=c("E2","E3",NA),
               v3=c("E3","E5",NA))
    number <- c(100, 200, 300)
    
    index <- c("E1","E2","E3","E5")
    sapply(index, function(x) sum(number[apply(M==x, 1, any)], na.rm=TRUE))
    # > sapply(index, function(x) sum(number[apply(M==x, 1, any)], na.rm=TRUE))
    #  E1  E2  E3  E5 
    # 100 300 600 200 
    
        3
  •  1
  •   akrun    6 年前

    我们可以使用 aggregate 从…起 base R

    aggregate(total ~., data.frame(index = unlist(test[1:3]), 
           total = rep(test$number, each = 3)), sum, na.rm = TRUE)
    #   index total
    #1    E1   100
    #2    E2   300
    #3    E3   600
    #4    E5   300
    

    数据

    test <- data.frame(v1,v2,v3,number)