【问题标题】:Return and calculate values based on selected criteria根据所选条件返回和计算值
【发布时间】:2016-05-05 21:45:15
【问题描述】:

我一直在寻找,但仍然没有找到答案。我想根据我的标准查看和计算某些结果。 ifmatch 函数不会得到我想要的。原始数据集如下所示:

Type  Name  Value
A     DK    3
A     MO    2
A     OM    5
A     LSO   3
B     GOP   6
B     ADG   5
C     BFC   7
D     TMD   6

我想得到的是如果Type =A,然后列出名字并根据值计算权重,应该如下所示:

DK    0.081
MO    0.054
OM    0.135
LSO   0.081

感谢任何建议。非常感谢!

【问题讨论】:

  • prop.table 和子集? prop.table(Value)[Type == 'A']
  • 请始终添加创建 data.frame 的 R 代码以帮助更轻松地回答您的问题 :-)
  • “基于值的权重”是指该值在组或所有组中的权重(小值表示)?
  • 抱歉,我是从 csv 文件导入的。基于值的权重是指在所有组中的权重。 rawr 的回答 (prop.table(Value)[Type == 'A']) 解决了我问题的第二部分。

标签: r


【解决方案1】:
require(dplyr)


d<-data.frame(Type=c("A","A","A","A","B","B","C","D"),
              Name = c("DK","MO","OM","LSO","GOP","ADG","BFC","TMD "),
              Value=c(3,2,5,3,6,5,7,6)
             )

dd<- d %>% 
      mutate(den=sum(Value)) %>% 
      filter(Type=="A") %>% 
      group_by(Name) %>% 
      summarise(Y=Value/min(den))
dd

【讨论】:

  • 谢谢 Gaurav,但我知道了 Error: could not find function "%&gt;%" 如何解决这个问题?
  • 你安装了 dplyr 包吗?尝试运行 install.packages("dplyr") 。如果已安装,您应该不会收到错误消息。
  • 忘记加载包。再次感谢您!
  • 嗨 Gaurav,当我将相同的代码应用于我自己的数据集时,我得到了Error: expecting a single value。如果我省略 summarize() 部分,我不会收到任何错误消息。知道是什么导致了这个问题吗?
  • @T-T,我的错,用summarise()代替summarize()
【解决方案2】:

如果性能很重要并且您有大量数据,请使用 data.table 包中的 data.table:

dt <- data.table( type=c("A", "A", "A", "A", "B", "B", "C", "D")
                  , name=c("DK", "MO", "OM", "LSO", "GOP", "ADG", "BFC", "TMD")
                  , value=c(3, 2, 5, 3, 6, 5, 7, 6))

value.total <- sum(dt$value)

dt[type=="A", .(name, weight=value/value.total)]

这将导致:

   name     weight
1:   DK 0.08108108
2:   MO 0.05405405
3:   OM 0.13513514
4:  LSO 0.08108108

如果您想计算每行(不仅是“A”)的权重(“比例”),请使用:

dt[, .(name, weight=value/value.total)]

结果:

   name     weight
1:   DK 0.08108108
2:   MO 0.05405405
3:   OM 0.13513514
4:  LSO 0.08108108
5:  GOP 0.16216216
6:  ADG 0.13513514
7:  BFC 0.18918919
8:  TMD 0.16216216

【讨论】:

  • 完美!非常感谢!
【解决方案3】:
Type <- c('A','A','A','A','B','B','C','D')
Name <- c('DK', 'MO', 'OM', 'LSO', 'GOP', 'ADG','BFC','TMD')
Value <- c(3,2,5,3,6,5,7,6)
Dat <- data.frame(Type, Name,Value)
Dat
     Type Name Value
1    A   DK     3
2    A   MO     2
3    A   OM     5
4    A  LSO     3
5    B  GOP     6
6    B  ADG     5
7    C  BFC     7
8    D  TMD     6

new.dat <- data.frame(Name, Weight=(Value/sum(Value)))
new.dat
    Name     Weight
1   DK       0.08108108
2   MO       0.05405405
3   OM       0.13513514
4   LSO      0.08108108
5   GOP      0.16216216
6   ADG      0.13513514
7   BFC      0.18918919
8   TMD      0.16216216

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 2021-08-31
    • 2021-10-04
    • 2016-09-30
    • 2020-10-23
    相关资源
    最近更新 更多