【发布时间】:2017-01-07 16:14:21
【问题描述】:
我有一个这样的查找表:
0 1 2 3 4 5 6 7 8 9 h H k K m M b B + - ?
0 1 2 3 4 5 6 7 8 9 2 2 3 3 6 6 9 9 0 0 0 0
使用此代码构建
symbols <- c("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "h", "H", "k", "K", "m", "M", "b", "B","", "+", "-", "?")
exp <- c(seq(0,9),2,2,3,3,6,6,9,9,0,0,0,0)
names(exp) <- symbols
执行exp[["k]] 确实返回3 类numeric
我有一个 data.table noaa 包含 2 列,一列带有值,一列带有指数代码,如“k”或 4。
这个 DT 来自这个文件:https://d396qusza40orc.cloudfront.net/repdata%2Fdata%2FStormData.csv.bz2
我想在该data.table中创建一个新列TOTALVALUE,例如值是(下面是伪代码中的公式)
noaa$TOTALVALUE = noaa$VALUE*10^exp[[noaa$EXPONENT]] in which noaa$EXPONENT value is matched using the exp matching table
我尝试了以下代码
noaa$test <- with(noaa, PROPDMG*10^exp[[PROPDMGEXP]])
我明白了
Error in exp[[PROPDMGEXP]] :
attempt to select more than one element in vectorIndex
如果我删除 [] 之一,它会进入无限循环并崩溃。
实现这一目标的最佳方法是什么?到目前为止,我想出的其他选择是将exp 构建为数据框并使用匹配,或者构建一个函数并在其上使用 lapply
【问题讨论】:
-
请提供一个可重现的例子。
DT或noaa是什么?顺便说一句,[[用于选择单个元素。对于多个条目,请使用[即as.vector(exp[c("1", "k")])而不是exp[[c("1", "k")]] -
以下内容对您有用
DT[, TOTALVALUE := VALUE*10^exp[EXPONENT]] -
我添加了 data.table 的来源,但我的问题是关于方法:如何在数据表上添加一个新列,该列将由涉及匹配表的计算填充?
-
在这种情况下,第二条评论应该对您有所帮助。
标签: r data.table