通过选择数据集和子集列的函数对数据框进行子集化
Subset a data frame by a function that selects a dataset and a column for subset
我创建了一个 objective 用于 select 不同数据帧之间的函数,并从该数据中的 selected 列子集 selected 数据帧框架:
#Dataset 1
cases <- c(1:10)
op1 <- c(1,0,1,1,1,1,0,0,0,0)
op2 <- c(1,0,1,0,0,0,0,0,0,0)
Dataset1 <- data.frame(cases,option1= op1,option2= op2)
#Dataset 2
cases <- c(1:10)
op3 <- c(1,0,1,1,1,1,0,0,0,0)
op4 <- c(1,0,1,0,0,0,0,0,0,0)
Dataset2 <- data.frame(cases,option1=op3 ,option2= op4)
# The function
Data <- function( selection, dataset){
Dataset1 <- with( dataset, dataset [selection == 1,])
Dataset1
}
# example of intended use
Data(selection= option1, dataset= Dataset2)
这会产生一个错误:
Error in `[.data.frame`(dataset, selection == "1", ) :
object 'option1' not found
Called from: (function ()
{
.rs.breakOnError(TRUE)
})()
但如果我使用它 "manually" 它会起作用:
with( Dataset2, Dataset2 [option1 == 1,])
cases option1 option2
1 1 1 1
3 3 1 1
4 4 1 0
5 5 1 0
6 6 1 0
你知道我在创建函数时做错了什么吗?
感谢您的宝贵时间!
当您使用参数 x
调用函数 f
时,R
想要将对象传递给该函数。写入 f(x)
会使 R
在工作区中查找对象 x
。在您的情况下, x
未定义。 x
隐藏在另一个名为 Dataset1
的对象中。 R
在那里找不到 x
,所以它告诉你 object option1 not found
。然而,对象 op1
是在工作区中定义的。告诉 R
在哪里寻找 x
也是一个选项,这就是为什么传递 Dataset1$option1
会起作用的原因。同样,也可以直接传递对象,如字符"option1".
举例说明:
Data <- function( selection, dataset){ # this is your function
Dataset1 <- with( dataset, dataset [selection == 1,])
Dataset1
}
使用工作区中定义的对象op1
:
Data(selection= op1, dataset= Dataset2)
cases option1 option2
1 1 1 1
3 3 1 1
4 4 1 0
5 5 1 0
6 6 1 0
告诉 R
去哪里看:
Data(selection= Dataset1$option1, dataset= Dataset2)
cases option1 option2
1 1 1 1
3 3 1 1
4 4 1 0
5 5 1 0
6 6 1 0
或者将选择列的名称作为字符向量传递给 R
。这需要对函数进行一些调整:
Data <- function(selector, dataset){
Dataset1 <- dataset[dataset[,selector] == 1,]
Dataset1
}
Data(selector="option1", dataset= Dataset2)
cases option1 option2
1 1 1 1
3 3 1 1
4 4 1 0
5 5 1 0
6 6 1 0
它起作用的原因 "manually" 是您使用了 with(Dataset, ...)
包装器,因此 R
在 Dataset
的列名称中查找名为 option1
.
我创建了一个 objective 用于 select 不同数据帧之间的函数,并从该数据中的 selected 列子集 selected 数据帧框架:
#Dataset 1
cases <- c(1:10)
op1 <- c(1,0,1,1,1,1,0,0,0,0)
op2 <- c(1,0,1,0,0,0,0,0,0,0)
Dataset1 <- data.frame(cases,option1= op1,option2= op2)
#Dataset 2
cases <- c(1:10)
op3 <- c(1,0,1,1,1,1,0,0,0,0)
op4 <- c(1,0,1,0,0,0,0,0,0,0)
Dataset2 <- data.frame(cases,option1=op3 ,option2= op4)
# The function
Data <- function( selection, dataset){
Dataset1 <- with( dataset, dataset [selection == 1,])
Dataset1
}
# example of intended use
Data(selection= option1, dataset= Dataset2)
这会产生一个错误:
Error in `[.data.frame`(dataset, selection == "1", ) :
object 'option1' not found
Called from: (function ()
{
.rs.breakOnError(TRUE)
})()
但如果我使用它 "manually" 它会起作用:
with( Dataset2, Dataset2 [option1 == 1,])
cases option1 option2
1 1 1 1
3 3 1 1
4 4 1 0
5 5 1 0
6 6 1 0
你知道我在创建函数时做错了什么吗? 感谢您的宝贵时间!
当您使用参数 x
调用函数 f
时,R
想要将对象传递给该函数。写入 f(x)
会使 R
在工作区中查找对象 x
。在您的情况下, x
未定义。 x
隐藏在另一个名为 Dataset1
的对象中。 R
在那里找不到 x
,所以它告诉你 object option1 not found
。然而,对象 op1
是在工作区中定义的。告诉 R
在哪里寻找 x
也是一个选项,这就是为什么传递 Dataset1$option1
会起作用的原因。同样,也可以直接传递对象,如字符"option1".
举例说明:
Data <- function( selection, dataset){ # this is your function
Dataset1 <- with( dataset, dataset [selection == 1,])
Dataset1
}
使用工作区中定义的对象op1
:
Data(selection= op1, dataset= Dataset2)
cases option1 option2
1 1 1 1
3 3 1 1
4 4 1 0
5 5 1 0
6 6 1 0
告诉 R
去哪里看:
Data(selection= Dataset1$option1, dataset= Dataset2)
cases option1 option2
1 1 1 1
3 3 1 1
4 4 1 0
5 5 1 0
6 6 1 0
或者将选择列的名称作为字符向量传递给 R
。这需要对函数进行一些调整:
Data <- function(selector, dataset){
Dataset1 <- dataset[dataset[,selector] == 1,]
Dataset1
}
Data(selector="option1", dataset= Dataset2)
cases option1 option2
1 1 1 1
3 3 1 1
4 4 1 0
5 5 1 0
6 6 1 0
它起作用的原因 "manually" 是您使用了 with(Dataset, ...)
包装器,因此 R
在 Dataset
的列名称中查找名为 option1
.