【问题标题】:Subset a data frame by a function that selects a dataset and a column for subset通过选择数据集和子集列的函数对数据框进行子集
【发布时间】:2016-07-02 15:57:28
【问题描述】:

我创建了一个函数,其目标是在不同的数据帧之间进行选择,并从该数据帧中的选定列中选择选定的数据帧:

#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

你知道我在创建函数时做错了什么吗? 感谢您的宝贵时间!

【问题讨论】:

    标签: r function dataframe subset


    【解决方案1】:

    当您使用参数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
    

    它“手动”工作的原因是您使用了with(Dataset, ...) 包装器,因此RDataset 的列名中查找名为option1 的变量。

    【讨论】:

    • 感谢您的回复!如果我在函数中更改它不起作用: Data
    • 不要更改函数,更改函数调用,即调用函数时提供的参数。
    • 这使函数的可用性变得非常复杂,因为我计划在一个大数据集中传递许多数据集和许多列名,以获得不同的子数据集。你对如何解决这个问题有更多的想法吗? (再次感谢!)
    • @YDO 我在我的编辑中提供了一个关于如何做到这一点的示例。
    • 当您使用参数x 调用函数f 时,R 想要将对象传递给函数。写入f(x) 使R 在工作区中查找对象x。在您的情况下,x 未定义。 x 隐藏在另一个名为 Dataset1 的对象中。 R 在那里找不到x,所以它告诉你object option1 not found。但是,对象op1 是在工作区中定义的。告诉R 在哪里寻找x 也是一种选择,这就是传递Dataset1$option1 有效的原因。同样,您可以直接传递对象,如字符“option1”的情况。
    猜你喜欢
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 2019-11-12
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    相关资源
    最近更新 更多