【问题标题】:Subsetting odd rows in r using seq使用 seq 对 r 中的奇数行进行子集化
【发布时间】:2020-12-26 14:45:42
【问题描述】:

希望这不是一个太新手的问题。

我正在尝试从可从此处下载的 GDP UK 数据集中对行进行子集化: http://www.ons.gov.uk/ons/site-information/using-the-website/time-series/index.html

数据框看起来或多或少是这样的:

       X    ABMI
1   1948    283297
2   1949    293855
3   1950    304395

....

300 2013 Q2 381318
301 2013 Q3 384533
302 2013 Q4 387138
303 2014 Q1 390235

问题是,对于我的分析,我只需要 2004-2013 年的数据,并且我对每年的一个结果感兴趣,所以我想从位于 263 和 303 行之间的数据集中每隔四行获取一次。

基于以下网站:

https://stat.ethz.ch/pipermail/r-help/2008-June/165634.html (加上一些由于链接限制我无法引用的)

我尝试了以下方法,每次都收到一些错误消息:

> GDPUKodd <- seq(GDPUKsubset[263:302,], by = 4)
    Error in seq.default(GDPUKsubset[263:302, ], by = 4) : 
  argument 'from' musi mieæ d³ugoœæ 1

> OddGDPUK <- GDPUK[seq(263, 302, by = 4)]
    Error in `[.data.frame`(GDPUK, seq(263, 302, by = 4)) : 
  undefined columns selected

> OddGDPUKprim <- GDPUK[seq(263:302), by = 4]
Error in `[.data.frame`(GDPUK, seq(263:302), by = 4) : 
  unused argument (by = 4)

> OddGDPUK <- GDPUK[seq(from=263, to=302, by = 4)]
Error in `[.data.frame`(GDPUK, seq(from = 263, to = 302, by = 4)) : 
  undefined columns selected

> OddGDPUK <- GDPUK[seq(from=GDPUK[263,] to=GDPUK[302,] by = 4)]
Error: unexpected symbol in "OddGDPUK <- GDPUK[seq(from=GDPUK[263,] to"

> GDPUK[seq(1,nrows(GDPUK),by=4),]
Error in seq.default(1, nrows(GDPUK), by = 4) : 
  could not find function "nrows"

长话短说:帮助!

【问题讨论】:

  • 试试GDPUK[seq(263, 302, by=4),],看来你只是漏掉了一个逗号,告诉 r 你想要所有的列。
  • 欢迎。但是@janos 是正确的,首先清理数据将使您的子集比仅依赖行顺序更健壮。

标签: r seq


【解决方案1】:

您可以使用 subset 函数和基于值的适当过滤器,而不是尝试根据行 ID 提取数据。

例如,如果您的数据框有一个值为 1948...2014 的 year 列和一个值为 Q1..Q4 的 quarter 列,那么您可以通过以下方式获得正确的子集:

subset(data, year >= 2004 & year <= 2013 & quarter == 'Q1')

UDATE

我发现您的源数据,没有正确的年份和季度列。你可以这样清理它:

x <- read.csv('http://www.ons.gov.uk/ons/datasets-and-tables/downloads/csv.csv?dataset=pgdp&cdid=ABMI')
x$ABMI <- as.numeric(as.character(x$ABMI))
x$year <- as.numeric(gsub('[^0-9].*', '', x$X))
x$quarter <- gsub('[0-9]{4} (Q[1-4])', '\\1', x$X)
subset(x, year >= 2004 & year <= 2013 & quarter == 'Q1')

【讨论】:

  • 恐怕 Q1..Q4 不是单独的列,因为以前仅每年收集一次数据。它现在是年度专栏的一部分。
  • 谢谢。我特别感兴趣的是如何直接从他们所在的网站使用数据。不过,我将面临更多挑战,因为使用两种方法中的任何一种,ABMI 变量都被视为因子变量,我无法对其进行回归:>
  • 也许as.numeric(x$ABMI) 可以帮忙?
  • 不知何故不是那么容易。这不是第一次发生在我身上,到目前为止,我最终会创建一个单独的向量 c(..) "per hand"...
  • 我明白你的意思,怎么样:as.numeric(as.character(x$ABMI))
【解决方案2】:

您的代码GDPUK[seq(1,nrows(GDPUK),by=4),] 实际上可以很好地用于这些目的。您唯一需要更改的是nrownrows

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2022-01-08
    相关资源
    最近更新 更多