通过选择数据集和子集列的函数对数据框进行子集

时间:2016-03-16 16:19:31

标签: r function dataframe subset

我创建了一个功能,其目标是在不同的数据帧之间进行选择,并从该数据帧中的选定列中对所选数据帧进行子集化:

#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)
})()

但是如果我“手动”使用它就可以了:

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

创建函数时,你知道我做错了什么吗? 谢谢你的时间!

1 个答案:

答案 0 :(得分:1)

当您使用参数f调用函数x时,R想要将对象传递给函数。编写f(x)会使R在工作区中查找对象x。在您的情况下,x未定义。 x隐藏在另一个名为Dataset1的对象中。 R无法在x找到object option1 not found,因此它会告诉您op1。但是,对象R在工作空间中定义。告诉x寻找Dataset1$option1的位置也是一种选择,这就是为什么传递Data <- function( selection, dataset){ # this is your function Dataset1 <- with( dataset, dataset [selection == 1,]) Dataset1 } 会起作用的原因。同样,您可以直接传递对象,如字符&#34; option1&#34;。

举例说明:

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 。这需要对功能进行一些调整:

with(Dataset, ...)

它起作用的原因&#34;手动&#34;是您使用R包装器,以便Dataset查找名为option1的变量的id | Effective Date| Expiration Date| Eff Calendar Date| Exp Calendar Date -------------------------------------------------------------------------- 1 | 1095829 | 1840294 | ? |? 2 | 1093895 | 1838949 | ? |? 3 | 1095289 | 1835019 | ? |? 4 | 1093910 | 1840193 | ? |? 列名称。