【问题标题】:R: Create dataframes with function()R:使用 function() 创建数据框
【发布时间】:2026-02-23 03:50:01
【问题描述】:

我正在尝试使用 function() 创建一个数据框。

情况:我有以下包含信息的数据框:代码、子代码和描述。每个代码代表一个行业,子代码代表一个特定行业。

    > head(industries.split)
  Code Subcode                                  Description
1   13      00                                AEROSPACE    
2   13      10    Engines, Components & Parts Manufacturers
3   13      20 Military & Commercial Aircraft Manufacturers
4   13      30        Missile & Missile Parts Manufacturers
5   13      40    Private & Business Aircraft Manufacturers
6   13      50                   Miscellaneous Aerospace   
> tail(industries.split)
    Code Subcode                                     Description
198   85      91                                 Wholesalers    
199   85      92                      Miscellaneous Companies   
200   86      00             REUTERS FUNDAMENTALS-SOURCED DATA  
201   86      10 Industrial/Commercial format; Industry group NA
202   86      20                   Utilities; Industry group NA 
203   86      30                  Bank format; Industry group NA

我想将代码与子代码结合起来,然后排除子代码。 为此,我编写了以下函数,其中 name 是行业的占位符,code 是行业代码。

Industry.Filter <- function(name, code){
  name <- industries.split %>%
    filter(Code == code)
  name[,1] <- paste(name[,1], name[,2],sep = "")
  name <- name[,-2]
}

代码有效,但它不会将值存储在数据框中。

仅当我将其单独存储在数据框中时才有效:

aerospace <- Industry.Filter(aerospace, 13)

如何在函数前面没有 aerospace &lt;- 的情况下使用此函数。

【问题讨论】:

  • 有办法做到这一点,但不推荐。做aerospace &lt;- Industry.Filter(aerospace, 13)有什么问题?
  • 没有直接问题。我只是想弄清楚,是否有办法将存储过程包含到函数中以节省一些时间。
  • 这不会为您节省时间。如果您尝试实现将变量写入调用环境,从长远来看,这将花费您的时间。相信我们,除非您真的知道自己在做什么,否则您应该避免这种情况。如果您想了解有关如何完成的更多信息,请查看 R 中的 ?assign
  • @AllanCameron 这是否可能只是一个关于编写 OP 可以在管道中使用的函数的困惑问题?如果不是,那么我 100% 同意你的看法。

标签: r function dataframe


【解决方案1】:

它可以完成,但可能不是您目前使用的表单的功能,即使那样也不是您想要的那么容易。造成困难的原因是dplyr使用了非标准评估,或者NSE

您正在使用管道 (%&gt;%)。回想一下,默认情况下,管道的意思是“使用管道左侧的对象作为管道右侧函数的第一个参数”。

所以如果你有表单的功能

Industry.Filter <- function(data, code)

你可以在这样的语句中使用它

df <- df %>% Industry.Filter(code)

但是,如果您希望使用非标准评估,例如,您要过滤的列的名称是可变的,那么您会遇到问题。但这是可行的。幸运的是,这似乎不是您想要的。类似(未经测试的代码):

Industry.Filter <- function(data, code) {
 data %>%
   filter(Code == code) %>%
   mutate(Code = paste0(Code, Subcode) %>%
   select(-Subcode)
}

然后

aerospace <- df %>% Industry.Filter(13)

应该给你你想要的。

【讨论】: