我想对R中的每一行应用一个函数,该行“得分”一行x的每个值。好像我在R中使用'apply'函数来做这件事,但不知道该怎么做。我想输入一个带有整数值列的数据帧,并有一个带分数的矢量输出。我现在的代码如下:
ScoreFn <- function(x){
score <- 0
if(x<1) {
score <- 0
} else if(x==1) {
score <- 5
} else if(x==2) {
score <- 10
} else if(x==3) {
score <- 20
} else if(x >= 4 && x <= 10) {
score <- 30
} else if(x >= 11 && x <= 20) {
score <- 40
} else if(x >= 21) {
score <- 50
}
return(score)
}
apply(df$x, 1, ScoreFn())
另外,我收到此消息。不确定执行此功能的最佳方式。
1: In if (x < 1) { :
the condition has length > 1 and only the first element will be used
2: In if (x == 1) { :
the condition has length > 1 and only the first element will be used
3: In if (x == 2) { :
the condition has length > 1 and only the first element will be used
4: In if (x == 3) { :
the condition has length > 1 and only the first element will be used
...
答案 0 :(得分:4)
您可以使用剪切制作矢量化功能,因此您根本不必使用“应用”:
scorefun <- function(x){
as.numeric(as.character(cut(x, breaks = c(0, 1, 2, 3, 4, 11, 21, Inf),
labels = c(0,5,10,20,30,40, 50), right = FALSE)))
}
df <- data.frame(x = 0:10)
scorefun(df$x)
[1] 0 5 10 20 30 30 30 30 30 30 30
这也可以减少输入if / elses的重量,并且比非矢量化版本快10倍左右。
它的工作原理是将给定的向量(在这种情况下为df$x
)切割为切片,由断点给出。然后,我们会使用您的分数标记它们,然后使用as.character
和as.numeric
再次输出数字。
答案 1 :(得分:0)
如果您的输入只是data.frame的一列,则不需要使用apply
。您可以改为使用sapply
。
ScoreFn <- function(x){
score <- 0
if(x<1) {
score <- 0
} else if(x==1) {
score <- 5
} else if(x==2) {
score <- 10
} else if(x==3) {
score <- 20
} else if(x >= 4 && x <= 10) {
score <- 30
} else if(x >= 11 && x <= 20) {
score <- 40
} else if(x >= 21) {
score <- 50
}
return(score)
}
# Return a list of scores
sapply(df$x, ScoreFn)