使用R和dplyr对子集执行计算

时间:2016-05-22 23:52:04

标签: r data.table dplyr

我有4列的df - c(“Observation.ID”,“Event.Type”,“Property.Damage”,“Magnitude”)。

幅度值表示财产损失是以数千,数百万还是数十亿美元(“K”,“M”,“B”)给出的。

我想规范化Property.Damage,所以我需要分别计算3组:

update df set Property.Damage=(Property.Damage*n) where Magnitude='K'

在dplyr中,我理解如何拆分类,添加重新计算的属性损坏,合并,然后总结。当然可以更简单地做到这一点,一个SQL?

编辑:我使用data.table,因为与base相比,它感觉快速/轻松。例如:

setkey(df1, Magnitude)
df1["K", PROPDMG := PROPDMG*1e3]
df1["M", PROPDMG := PROPDMG*1e6]
df1["B", PROPDMG := PROPDMG*1e7]

3 个答案:

答案 0 :(得分:3)

你可能最好只做一个查找表并在进行乘法之前将其合并。类似的东西:

df <- data.frame(propdmg=1:6, magnitude=rep(c("K","M","B"),each=2))
df

#  propdmg magnitude
#1       1         K
#2       2         K
#3       3         M
#4       4         M
#5       5         B
#6       6         B

lkup <- data.frame(magnitude=c("K","M","B"),mult=c(1e3,1e6,1e7))
left_join(df, lkup) %>% mutate(result=propdmg * mult, mult=NULL)

#Joining by: "magnitude"
#  propdmg magnitude result
#1       1         K  1e+03
#2       2         K  2e+03
#3       3         M  3e+06
#4       4         M  4e+06
#5       5         B  5e+07
#6       6         B  6e+07

基数R中的直接等价物是:

transform(merge(df, lkup), result=mult * propdmg, mult=NULL)

答案 1 :(得分:2)

我发现data.table是最吸引人的方法。实际上,这已经将我从dplyr切换到data.table for split / apply / combine。虽然看起来base R表示键击次数最少 - 但我发现data.table的i,j, := is不那么令人讨厌。

setkey(df1, Magnitude)
df1["K", PROPDMG := PROPDMG*1e3]
df1["M", PROPDMG := PROPDMG*1e6]
df1["B", PROPDMG := PROPDMG*1e7]

或者,我们可以创建另一个 data.table ,如下所示:

df2 = data.table(Magnitude = c("K", "M", "B"), mult = c(1e3, 1e6, 1e9))

然后在加入时执行更新,如下所示:

df1[df2, PROPDMG := PROPDMG*mult, by=.EACHI, on="Magnitude"]

on=允许执行基于二进制搜索的子集/连接,而无需设置密钥。 by=.EACHI评估j每行df2中的表达式。 public ViewHolder(View v) { super(v); userAvatar = (ImageView) findViewById(R.id.profile_image_avatar); userID = (TextView) findViewById(R.id.user_ID); userComment = (TextView) findViewById(R.id.user_comment); }

答案 2 :(得分:1)

我们可以使用base R来执行此操作

transform(df1, Property.Damage = Property.Damage * setNames(c(1e3, 
            1e6, 1e9), c("K", "M", "B"))[Magnitude])

数据

df1 <- data.frame(Observation.ID = 1:5, Event.Type = LETTERS[1:5], 
     Property.Damage = c(1, 5, 3, 4, 7), 
     Magnitude = c("K", "M", "K", "B", "M"), stringsAsFactors=FALSE)