【问题标题】:Trying to loop through columns to produce a table for each尝试遍历列以为每个列生成一个表
【发布时间】:2023-03-30 23:45:01
【问题描述】:

我有一个有 10 列的表。这些列的名称如下:“月”、“年”、“建议”、“闲逛”、“食物”、“打印”、“用品”、“学习”、“借阅图书馆”、“其他”

我想遍历每个原因列,并创建一个按 Y 中的月份和 X 中的年份以及该原因类别的总和的表格。

我尝试创建一个 for 循环并使用 sapply/lapply 系列函数。但是,我不能超越“建议”。但是,如果我在每个单独的列上运行我的函数,它确实有效。

# Sample Data
AttendanceTab <- data.frame(Month = c("Oct", "Nov", "Oct", "Jan", "Feb", 
                                      "Mar", "May", "Oct"), 
                            Year = c( 2018, 2017, 2017, 2019, 2018, 2019, 
                                      2018, 2017), 
                            Advising = c(1, 1, 1, 0, 0, 1, 0, 0), 
                            Hang.Out = c(0, 0, 1, 0, 1, 1, 1, 0),
                            Food = c(1, 1, 1, 0, 0, 1, 1, 1)) 
attendance_summary <- function(ReasonName, FUN = sum) {
                    tapply(AttendanceTab[, ReasonName], 
                    AttendanceTab[,1:2], sum)
} 
attendance_summary("Advising") 
attendance_summary("Hang.Out")
attendance_summary("Food")
attendance_summary("Printing")
attendance_summary("Supplies")
attendance_summary("Studying")
attendance_summary("Lending.Library")
attendance_summary("Other") 
Complexes <- dim(AttendanceTab)[2]

reasons <- as.character(c("Advising", "Hang Out", "Food", 
          "Printing", "Supplies", "Studying", "Lending Library", 
          "Other"))
for(i in 1:Complexes) {
                    RR <- reasons[[i]]
                    ADSum <- attendance_summary(RR)
                    print(ADSum)
}
sapply(AttendanceTab, attendance_summary)
 #Also tried
sapply(reasons, attendance_summary)

例如reasons[[1]] 有效并给出了适当的表格,但是当它移动到第二个reasons元素时,它返回:

[.data.frame(attendance2, , ReasonName) 中的错误: 选择了未定义的列

【问题讨论】:

  • make this question reproducible 包含一些纯文本格式的示例数据和所需输出的示例。
  • 谢谢!我刚刚添加了一些示例数据。

标签: r function dataframe for-loop sapply


【解决方案1】:

您在定义reasons 时有错字。在AttendanceTab 中,您有Hang.Out 列,在reasons 中,您将其称为Hang Out - space 而不是.。 为避免这种情况,您可以使用

reasons <- names(AttendanceTab)[-c(1:2)]
Complexes <- length(reasons)

【讨论】:

  • 错字是问题所在。谢谢,我会改正的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 2016-08-09
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多