【问题标题】:Counting elements in a matrix r计算矩阵 r 中的元素
【发布时间】:2018-04-17 11:42:27
【问题描述】:

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

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

我想要一个像我的数据框“结果”这样的结果。 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))

谢谢你:)

【问题讨论】:

  • 不是你的问题的答案,但没有必要在你的数据框中使用cbinddata.frame(index,total) 可以。
  • 对于“E5”,我在结果中得到值 200。对吗?

标签: r dataframe matrix


【解决方案1】:

试试这个:

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】:

    这是一个以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 
    

    【讨论】:

    • 感谢您的解决方案,但它在我的计算机上不起作用...应用错误(M == x,1,任何):找不到对象'M'
    • M &lt;- cbind(v1, v2, v3) 我使用了这个矩阵(而不是数据框)。
    【解决方案3】:

    我们可以使用来自base Raggregate

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多