【发布时间】:2014-10-08 23:12:29
【问题描述】:
我有一个 data.table
dt2 <- data.table(urn=1:10,freq=0, freqband="")
dt2$freqband = NA
dt2$freq <- 1:7 #does give a warning message
## urn freq freqband
## 1: 1 1 NA
## 2: 2 2 NA
## 3: 3 3 NA
## 4: 4 4 NA
## 5: 5 5 NA
## 6: 6 6 NA
## 7: 7 7 NA
## 8: 8 1 NA
## 9: 9 2 NA
##10: 10 3 NA
我还有一个函数想用来对我的频率列进行分组
fn_GetFrequency <- function(numgifts) {
if (numgifts <5) return("<5")
if (numgifts >=5) return("5+")
return("ERROR")
}
我想根据这个函数设置 freqband 列。在某些情况下,它将是所有记录,在某些情况下,它将是一个子集。我目前的方法是(对于一个子集):
dt2[dt2$urn < 9, freqband := fn_GetFrequency(freq)]
使用这种方法我收到警告:
Warning message:
In if (numgifts < 5) return("<5") :
the condition has length > 1 and only the first element will be used
然后它将所有记录的值设置为“
任何帮助将不胜感激。
编辑:如果你使用一个需要 2 个参数的函数,你会怎么做?
更新:在我尝试更新后包含 dt2 的输出
urn freq freqband
1: 1 1 <5
2: 2 2 <5
3: 3 3 <5
4: 4 4 <5
5: 5 5 <5
6: 6 6 <5
7: 7 7 <5
8: 8 1 <5
9: 9 2 NA
10: 10 3 NA
更新:我尝试了这段代码,它可以提供所需的输出,它允许我拥有一个我也可以在其他代码位置调用的函数。
dt2[dt2$urn < 9, freqband := sapply(freq, fn_GetFrequency)]
【问题讨论】:
-
你定义的那个函数总是返回“ERROR”。您需要了解
if和 'ifelse` 之间的区别。 R 不是 SAS。 -
@BondedDust 我没有得到“错误”,因为第一个值满足第一个条件,因此返回“
标签: r function data.table sapply