我有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]
答案 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)