【问题标题】:Displaying multiple summeries in R code在 R 代码中显示多个摘要
【发布时间】:2014-09-04 02:53:59
【问题描述】:

我是堆栈溢出的新手,也是 R 编程的新手,所以如果这个问题听起来有点傻,请原谅。

我想问任何知情人士,是否可以仅通过一个代码命令显示多个摘要。

仅举一个我想要实现的示例:数据框由多年的每日气候数据组成(包括大约 6 个不同的变量)

sub <- subset(data, Month == "Sep" & Day==2, !is.na(data), select = MSLP:Temp)
summary(sub,mean)

      MSLP        Direction         Speed             Temp      
 Min.   : 976   Min.   :  8.4   Min.   : 1.680   Min.   : 8.18  
 1st Qu.:1007   1st Qu.:167.8   1st Qu.: 6.095   1st Qu.:13.04  
 Median :1016   Median :229.7   Median :10.010   Median :14.73  
 Mean   :1014   Mean   :213.0   Mean   :10.042   Mean   :14.68  
 3rd Qu.:1022   3rd Qu.:270.4   3rd Qu.:13.320   3rd Qu.:16.40  
 Max.   :1034   Max.   :353.6   Max.   :25.640   Max.   :21.58 

到目前为止一切顺利。但我想问的是,如果有人知道,是否可以在上述代码中包含一些内容以显示设定时间段内每一天的摘要?说从第 2 天到第 10 天。

如果可以,是否可以在上述代码中包含另一个标准以包含特定年份?即:

sub <- subset(data, Month == "Sep" & Day==2 - include year etc.

因为我根本想不通。例如,如果我这样做了

sub <- subset(data, Month == "Sep" & Day==2 & Year == 1967 #etc ...)

我只是得到一个这样的错误代码:

Error in eval(expr, envir, enclos)

如果这些问题看起来有点白痴,再次道歉,但如果有人对上述问题有任何解决方案,我将不胜感激。

【问题讨论】:

  • 请包括示例输入数据,并清楚您想要的输出是什么。提问时,您应该始终尝试添加reproducible example。但听起来aggregate 函数可能是更好的选择。或者pe

标签: r


【解决方案1】:

你当然可以!如果您使用summary 函数将结果打印到控制台,我假设您需要汇总的天数不会太多(

这是mtcars 数据集的示例(R 附带) 数据(mtcars) 摘要(mtcars)

for(i in unique(mtcars$cyl)) {
  print(paste("summary for dataset when cyl ==", i))
  print(summary(mtcars[mtcars$cyl==i,]))
}

就您而言,我认为您可以使用它来打印第 2-10 天的摘要:

for(i in 2:10) {
  print(paste("summary for day ==", i))
  sub <- subset(data, Month == "Sep" & Day==i, !is.na(data), select = MSLP:Temp)
  print(summary(sub)
}

您绝对可以在您的子集函数中包含第三个条件,例如Year==1967。也许年没有定义? Error in eval(expr, envir, enclos) 通常在未定义对象时出现。尝试class(data$Year) 以确保data$Year 是数字或整数类型。

【讨论】:

  • ajb,非常感谢您的回复和有用的回复!我测试了 mtcars 的例子,效果很好!就像我自己的数据集的功能一样,您非常友好地放在一起!但是只有一个问题,这无疑是我做的非常错误的事情,摘要列表中的所有结果都显示为“NA”或“NAN”。我试图弄乱“na.rm = TRUE”命令,但无论我将它放在函数中的哪个位置,它都不起作用。 EG: sub
  • 你能否复制运行时 R 吐出的内容str(data)
  • 进一步检查...如果您只想选择名为“MSLP”和“Temp”的列,您需要:subset(data, Month == "Sep" &amp; Day==2, select = c("MSLP", "Temp")) 如果您想从此数据框中删除 NA,请参阅此 @ 987654321@ 可能有更清洁的方法,但有两个步骤可以:df1 &lt;- subset(data, Month == "Sep" &amp; Day==2, select = c("MSLP", "Temp"))df2 &lt;- [rowSums(is.na(df1))==0, ]
  • 嗨 ajb,再次感谢您的回复! str(数据)'data.frame':2168 obs。 10 个变量: $ 年:int 2009 2009 2009 2009 2009 2009 2009 2009 2009 2009 ... $ 月:num 1 1 1 1 1 1 1 1 1 1 ... $ 日期:int 1 2 3 4 5 6 7 8 9 10 ... $ Day : int 5 6 7 1 2 3 4 5 6 7 ... $ Full.Date: Factor w/ 2066 levels "","2009-01-01",..: 2 3 4 5 6 7 8 9 10 11 ... $ 最大值: num 3.3 3.2 2.4 6.6 4.9 1.5 2.4 3.7 6.6 9.1 ... $ 最小值: num 1.7 -0.7 -3 1.2 -3 -5.8 -5.7 -1.4 0.6 2.8 ... $雨:num 0 0 0 0.8 0 0 0 0 0 12.8 ... $ 风:num 17.4 13.1 7.8 7.5 11.1 6 6.6
  • 补充一下,我正在使用一个不同的、较小的数据集进行练习,标题略有不同。正如你所看到的,它有点乱。请接受我对所有这些问题的歉意。我尝试了“2 个步骤”,但在“df2
【解决方案2】:

我最终通过稍微调整 ajb 非常有用的功能使其工作(减去 NAs/NANS)。

以下函数显示 8 月 31 天中每一天所选变量的单独摘要:

for(i in 1:31) {
print(paste("summary for date ==", i))
x <- subset(df, Month == 8 & Date==i, select = V1:V4)
print(summary(x,is.na=T[x$Date==i,]))
}

仍然会产生错误消息,因此显然需要对其进行更多处理,但主要是仍然会产生结果。

编辑,发现问题。尽管产生了预期的结果,但放置在“x”函数中的无用“is.na”函数会产生错误消息。上述功能已被编辑并产生更清晰的结果。

【讨论】:

    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2018-09-03
    相关资源
    最近更新 更多