如何使函数使用一对或多对值(x1,y1; x2,y2; ......根据需要)来对数据帧进行子集化,如
selection <- function(x1,y1, ...){
dfselected <- subset(df, V1 == "x1" & V2 == "y1"
## MAY OR MAY NOT BE PRESENT ##
| V1 == "x2" & V2 == "y2")
return(dfselected)
}
我可以使用subset()
进行单个索引。例如:
df <- data.frame(
V1 = c(rep("a",5), rep("b",5)),
V2 = rep(c(1:5),2),
V3 = c(101:110)
)
即
V1 V2 V3
a 1 101
a 2 102
a 3 103
a 4 104
a 5 105
b 1 106
b 2 107
b 3 108
b 4 109
b 5 110
情侣的子集(“a”,“3”)和(“b”,“4”)看起来像
dfselected <- subset(df, V1 == "a" & V2 == 3 | V1 == "b" & V2 == 4 )
我找不到类似的功能。我不知道是否必须将未指定数量的参数传递给函数(所谓的“三点”)或使用if/else
。我是功能的初学者,所以也欢迎链接或示例。
我主要从那开始:http://www.ats.ucla.edu/stat/r/library/intro_function.htm
------------------------------在hadley回答后的解决方案
selection <- function (x,y){
match <- data.frame(
V1 = x,
V2 = y,
stringsAsFactors = FALSE
)
return(dplyr::semi_join(df, match))
}
答案 0 :(得分:3)
听起来你想要一个半连接:找到x中所有y行中匹配条目的行:
df <- data.frame(
V1 = c(rep("a",5), rep("b",5)),
V2 = rep(c(1:5), 2),
V3 = c(101:110),
stringsAsFactors = FALSE
)
match <- data.frame(
V1 = c("a", "b"),
V2 = c(3L, 4L),
stringsAsFactors = FALSE
)
library(dplyr)
semi_join(df, match)
答案 1 :(得分:2)
除非我遗漏了某些东西,否则你可以使用基础R merge()
。
使用Hadley提供的两个示例data.frames,
merge(df, match)
# V1 V2 V3
# 1 a 3 103
# 2 b 4 109