【问题标题】:Problems with grouping factor, data frame, and tapply分组因子、数据框和 tapply 的问题
【发布时间】:2013-04-15 06:09:12
【问题描述】:

我对 R 和一般统计数据非常陌生,并且无法让 tapply() 工作。我有一个包含 15 列和数千行的数据框。我使用y1<-((x>0)&(x<=5)) 和类似的东西制作了一堆逻辑向量,其中 x 是数据框中的列名。然后将这些逻辑向量组合并使用 factor() 转换为分组因子。一切看起来都很好。

问题是,当我尝试将 tapply() 与 tapply(dataframe, group, sample, size=20) 一起使用时,group 是分组因子,我收到错误:“参数必须具有相同的长度”。当我尝试length(dataframe) 时,我得到数据框中的列数(只有 15 个),而length(group) 返回行数(千)。我创建逻辑向量和分组因子的方式是否有错误?

这是 Maxim.K 建议的 dput() 的输出:(抱歉,它不是很整洁)

 structure(list(Lat = c(-90L, -90L, -90L, -90L, -90L, -90L, -90L, 
-90L, -90L, -90L, -90L, -90L, -90L, -90L, -90L), Lon = -180:-166, 
    Jan = c(2.79, 2.79, 2.79, 2.79, 2.79, 2.79, 2.79, 2.79, 2.79, 
    2.79, 2.79, 2.79, 2.79, 2.79, 2.79), Feb = c(2.35, 2.35, 
    2.35, 2.35, 2.35, 2.35, 2.35, 2.35, 2.35, 2.35, 2.35, 2.35, 
    2.35, 2.35, 2.35), Mar = c(0.49, 0.49, 0.49, 0.49, 0.49, 
    0.49, 0.49, 0.49, 0.49, 0.49, 0.49, 0.49, 0.49, 0.49, 0.49
    ), Apr = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
    May = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Jun = c(0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Jul = c(0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Aug = c(0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Sep = c(0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Oct = c(1.75, 1.75, 1.75, 
    1.75, 1.75, 1.75, 1.75, 1.75, 1.75, 1.75, 1.75, 1.75, 1.75, 
    1.75, 1.75), Nov = c(2.77, 2.77, 2.77, 2.77, 2.77, 2.77, 
    2.77, 2.77, 2.77, 2.77, 2.77, 2.77, 2.77, 2.77, 2.77), Dec = c(2.65, 
    2.65, 2.65, 2.65, 2.65, 2.65, 2.65, 2.65, 2.65, 2.65, 2.65, 
    2.65, 2.65, 2.65, 2.65), Ann = c(1.07, 1.07, 1.07, 1.07, 
    1.07, 1.07, 1.07, 1.07, 1.07, 1.07, 1.07, 1.07, 1.07, 1.07, 
    1.07)), .Names = c("Lat", "Lon", "Jan", "Feb", "Mar", "Apr", 
"May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "Ann"
), row.names = c(NA, 15L), class = "data.frame")

对于组:

头部的 15 个值(来自 dput())

  structure(c(8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 
    8L, 8L), .Label = c("1", "2", "3", "4", "5", "6", "7", "8"), class = "factor")

...从尾巴开始

structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L), .Label = c("1", "2", "3", "4", "5", "6", "7", "8"), class = "factor")

我正在尝试使用 tapply()(大小为 20)从所有 8 个类别中抽取随机样本。

[edit] 不出所料,问题不在于问题和要求,而在于我的理解。我误读了这个问题;事实上,我应该只从一列中采样,而不是从整个数据框中。

【问题讨论】:

  • 如果您提供一些示例数据,这个问题会更容易回答。使用dput(head(yourdata,15)) 或在此程度上可能会有所帮助。
  • 您可能希望使用nrow(dataframe)(给出行数)而不是length(dataframe)(给出列数)进行比较。
  • 谢谢,我刚试过,它会返回正确的行数(即数据框中的行数与分组因子中的行数相同)。
  • 你已经提供了输入数据,好吧。但是我们没有group。您的帖子还不能完全重现。另外,您寻求的最终输出是什么?这些元素会让你更快得到答案。
  • @FalseAzure 您收到该错误是因为您将data.frame 而不是vector 提供给tapply 函数。仔细阅读您必须找到的帮助文件:X an atomic object, typically a vector. 也许aggregate 更适合这种情况。

标签: r statistics dataframe tapply


【解决方案1】:

tapply 可以在这里使用,您只需将group 向量添加到您的data.frame,然后使用tapply,如下所示:

# Generating a 'group' vector with variability in its values 
# and merging it to the existing data.frame (FOO)
set.seed(1)
FOO$group <- as.factor(sample( 1:8, nrow(FOO), replace=TRUE)) 

# Using tapply
tapply(FOO[,-16], FOO[,16], sample, size=20, replace=TRUE)

这可能是你作业的答案。

【讨论】:

  • 谢谢!出于某种原因,我仍然遇到同样的错误,但我应该能够弄清楚。
猜你喜欢
  • 2019-03-14
  • 1970-01-01
  • 2014-02-05
  • 2012-11-09
  • 1970-01-01
  • 2022-11-11
  • 2015-08-17
  • 2016-03-15
  • 2021-04-16
相关资源
最近更新 更多