【问题标题】:Looping a functions based on elements of a list基于列表元素循环函数
【发布时间】:2019-09-03 11:55:27
【问题描述】:

我在尝试基于列表循环函数并创建结果表时遇到了一些麻烦。

head(Dat17_18.3[,c(1,3:5)])
                     Program Area I.E.ScoreStat I.I.ScoreStat I.P.ScoreStat
1             BFA - Art Education             2             2             2
2 BA - Foreign Language Education             2             2             3
3      MAT - Elementary Education             2             2             2
4            BA - Dance Education             2             3             3
5      MAT - Elementary Education             2             3             3
6      MAT - Elementary Education             2             2             3

我已经使用split 函数创建了一个程序区域列表。

test1<- split(Dat17_18.3, Dat17_18.3$`Program Area`)

我编写了一个函数,用于从 psych 包中的 alpha 函数中提取元素。

alpha_fun <- function (df,columns){
  library(psych)
  a1 <- alpha(df[,columns])
  a2 <- alpha.ci(a1[[1]][1],nrow(df),length(columns))
  vec1 <- c(nrow(x),a1[[1]][1],a2[1],a2[3],a1[[1]][3])
  return(vec1)
}

我想让 alpha_fun 为测试中的每个元素运行一次,以便为所有程序区域创建一个表。

【问题讨论】:

  • 你的函数的参数是什么?哪一个是数据框,另一个是什么,它是从哪里得出的?建议使用更清晰的名称:function(df, num)?
  • 函数的参数是x=df, y=col_numbers。
  • 您有包裹限制吗?您是否愿意接受使用例如`dplyr, data.table, or purrr`的解决方案?还是您想主要留在基础 R 中?
  • @Gregor,没有限制

标签: r function datatable sapply


【解决方案1】:

考虑bytapply 的面向对象包装器),它类似于split + lapply,其中一个函数可以直接应用于数据帧分组的每个子集。另外,避免需要 columns 参数,该参数可以从方法内的数据框输入中检索:

library(psych)

alpha_fun <- function (df){   
  sub <- df[, 3:ncol(df)]              # KEEP ONLY NUMERIC COLS

  a1 <- alpha(sub)
  a2 <- alpha.ci(a1[[1]][1], nrow(sub), ncol(sub))
  vec1 <- c(nrow(sub), a1[[1]][1], a2[1], a2[3], a1[[1]][3])

  return(vec1)
}

# LIST OF VECTORS 
alpha_vec_list <- by(Dat17_18.3, Dat17_18.3$`Program Area`, alpha_fun)

# MATRIX WITH Program Area AS ROW NAMES
alpha_mat <- do.call(rbind, alpha_vec_list)

【讨论】:

  • alpha_vec_list 正在整个数据集中运行 alpha_fun,包括 alpha_fun 无法处理的两个字符列。
  • 我可能误解了您的问题。你能改写吗? by 函数应该将整个数据集(不是整个 df)的 Program_Area 子集发送到 alpha_fun 方法中。 alpha_vec_list 的输出究竟是什么?
  • alpha_fun 只接受数值,因此当包含字符的Dat17_18.3 时,alpha_fun 将不会运行。我试图指定在by 中使用哪些列(即by(Dat17_18.3[,3:12], Dat17_18.3$`Program Area`, alpha_fun) 语句,这将使Dat17_18.3$`Program Area` 未使用。
  • 在调用 alpha 之前查看更新,您可以在其中对 alpha_fun 中的列进行子集化。注意现在引用 sub 的其他行(不是 df 输入)。
猜你喜欢
  • 2017-03-21
  • 1970-01-01
  • 2017-01-18
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多