[英]How do I apply a function that operates a data.table and use 2 or more values as a parameter R
I have the following data.table 我有以下数据表
k
v1 v2 v3 v4
1: 1 US a up
2: 2 CA a up
3: 3 US b down
4: 4 CA a down
5: 5 US b up
6: 6 CA b down
And I want to recreate the following operation using a function 我想使用一个函数重新创建以下操作
k[v3 %in% unique(k$v3) & v4=="up",list("sum" = sum(v1)),by=v2]
v2 sum
1: US 6
2: CA 2
So far I got this 到目前为止,我知道了
myfun <- function(x,y,z) {
w <- x[v3 %in% y & v4 %in% z,list("sum" = sum(v1)),by=v2]
print(w)
}
myfun(k,"a","up")
v2 sum
1: US 1
2: CA 2
How can I enhance this function to be able to use more than one parameter in each expression, y,z. 我如何增强此功能,以便能够在每个表达式y,z中使用多个参数。 I have tried with the following function, setting an option called "All" that is a vector of all unique values of each column but it returns a data.table with zero rows
我尝试使用以下功能,设置一个名为“ All”的选项,该选项是每一列的所有唯一值的向量,但它返回的data.table包含零行
myfun <- function(x,y,z) {
ifelse(y == "All" ,y==unique(x$v3),y==y)
ifelse(z == "All" ,z==unique(x$v2),z==z)
w <- x[v3 %in% y & v4 %in% z,list("sum" = sum(v1)),by=v2]
print(w)
}
This should get you started: 这应该使您开始:
myfun <- function(x,y,z) {
if (length(y) == 1 && y == "All") {
cond1 = TRUE
} else {
cond1 = quote(v3 %in% y)
}
if (length(z) == 1 && z == "All") {
cond2 = TRUE
} else {
cond2 = quote(v4 %in% z)
}
x[eval(cond1) & eval(cond2), list("sum" = sum(v1)), by=v2]
}
myfun(k, "a", "up")
# v2 sum
#1: US 1
#2: CA 2
myfun(k, "All", "up")
# v2 sum
#1: US 6
#2: CA 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.