【问题标题】:Subsetting a data from within a function in R从 R 中的函数中对数据进行子集化
【发布时间】:2019-09-26 21:11:57
【问题描述】:

我知道这个问题有很多答案,我从今天早上 10 点开始阅读它们(现在是下午 5 点)。

我一直试图弄清楚,我认为这很简单,如何从我的函数中对数据框进行子集化。我要做的就是打印出理想情况下通过对 DF 进行子集生成的向量。我遇到的问题是我在其他地方使用相同的desired_column_name 直接引用数据框,因此,我不能只是在我的论点中“添加引号”。我尝试在desired_column_name 参数中添加引号,然后在函数内应用noquote,但这也不起作用,并且使事情变得更糟。

以下是我正在使用的简单输入:

S = c(1,0,0,4,1,6,6,3,5,3,1)
population = data.frame(S)

下面是代码供参考:

proportion_of_elements= function(df_for_use, desired_column_name, desired_elements,logical){     

  DF = df_for_use

  chr_desired_column_name = as.character(desired_column_name)

  desired_column =  DF[,chr_desired_column_name]


  vec_length = length(desired_column)
  num_of_desired_element = sum(desired_column == desired_elements)
  proportion = num_of_desired_element/vec_length


  statement_for_pop_prop = c("The proportion of ", desired_elements,'\'s', "from the population is: ", proportion)
  format_vers_of_statement_for_pop_prop = str_c(statement_for_pop_prop, collapse = " ")

  # summary = summarize(data_frame, mean = mean(desired_column_name, na.rm = TRUE), var = var(desired_column_name, na.rm = TRUE), sd = sd(desired_column_name, na.rm = TRUE))
  # 
  # statement_of_summary = c("The summary statistics are the following: ", summary)
  # 
  # format_of_summary = str_c(statement_of_summary, collapse = " ")

  #print(format_vers_of_statement_for_pop_prop)
   print(desired_column)

}

可重现的例子:

proportion_of_elements(population,S,1,FALSE)

期望的输出:

1 0 0 4 1 6 6 3 5 3 1

电流输出:

 Error in `[.data.frame`(DF, , chr_desired_column_name) : 
  undefined columns selected 

如前所述,我可以获得所需的输出,但这需要我在 desired_column_name 参数周围加上引号,这会导致其他所有内容都中断。

如您所见,我还尝试了另一种建议的解决方案,即在函数中重新定义数据框本身。我用DF 试过这个。注释掉的代码是使用desired_column_name 不带引号的部分。

如果我的代码过于复杂,我深表歉意。我看到的主要问题与desired_column 的解释方式有关。所以这是需要重点关注的部分。

感谢所有提供任何建议的人。

编辑

在 G. Grothendieck 给出的建议之后,我编辑了我的代码并得到了以下错误:

【问题讨论】:

  • 您需要一个可重现的示例。向我们展示您拥有什么以及您想要生产什么。
  • 将编辑...现在
  • 这就是我遇到的问题。它不能与引号一起使用。在我的代码的注释掉部分中,我引用了数据框的列,它使用S 不带引号。
  • 你确定你想要的输出是1 0 0 4 1 6 6 3 5 3 1而不是1 4 1 6 6 0 1 0 1
  • @VitaliAvagyan 在我调整代码以生成结果时将其完全复制到 R 中

标签: r function dataframe subset


【解决方案1】:

大概你想要这样的东西:

prop_elem <- function(data, col, elem) {

  prop <- mean(data[[col]] == elem, na.rm = TRUE)
  cat("The proportion of", elem, "in column", col, "is", prop, "\n")

  Mean <- mean(data[[col]], na.rm = TRUE)
  cat("The mean of column", col, "is", Mean, "\n")

  data[[col]]
}

prop_elem(population, "S", 1)

给予:

The proportion of 1 in column S is 0.2727273 
The mean of column S is 2.727273 
 [1] 1 0 0 4 1 6 6 3 5 3 1

【讨论】:

  • 是的....这就是我想要的。 data[[col]] 上的双括号对数据框做了什么?以及为什么还要在最后说明?
  • 如果col 是列名,那么data[[col]] 就是该列。
  • 实际上我尝试了您发布的编辑,但我仍然遇到问题:desired_column = df_for_use[[desired_column_name]] vec_length = length(df_for_use[[desired_column_name]]) num_of_desired_element = sum(df_for_use[[desired_column_name]] == desired_elements) 报告错误:Error in .subset2(x, i, exact = exact) : recursive indexing failed at level 2
  • 我所做的只是将desired_column_name 替换为您输入的版本[[desired_column_name]]
  • 可重现的代码是否适合注释?
猜你喜欢
  • 2019-09-26
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
相关资源
最近更新 更多