【问题标题】:In R: Extract specific columns from data frame by date and keep basic columns at beginning在 R 中:按日期从数据框中提取特定列并将基本列保留在开头
【发布时间】:2020-12-03 10:41:28
【问题描述】:

我有几个大数据框,其中包含 2007-2019 年特定坐标的时间序列数据。 8113 行和 301 列。每年分为 16 天的时间步长,这导致每个坐标每年有 23 个值。 它看起来像这样:

X   longitude   latitude   label     2007-01-07   2007-01-23 ... 2019-12-10   2019-12-26  
1   -56.58652   -30.87850  cropland  0.08367160   0.07883158     0.07414120   0.08120061
2   -56.58458   -30.88260  cropland  0.07888613   0.07438400     0.07831833   0.07352642
3   -56.58429   -30.87860  cropland  0.08331446   0.07837244     0.07169452   0.07229450

我想将数据框划分为年份,保持每个子集的前四列相同。然后将它们一起保存在数据框列表中。所以我要找的输出应该是这样的:

X   longitude   latitude   label     2007-01-07   2007-01-23   ...
1   -56.58652   -30.87850  cropland  0.08367160   0.07883158   ...  
2   -56.58458   -30.88260  cropland  0.07888613   0.07438400   ...  
3   -56.58429   -30.87860  cropland  0.08331446   0.07837244   ...
X   longitude   latitude   label     2008-01-10   2008-01-26   ...
1   -56.58652   -30.87850  cropland  0.08367160   0.07883158   ...  
2   -56.58458   -30.88260  cropland  0.07888613   0.07438400   ...  
3   -56.58429   -30.87860  cropland  0.08331446   0.07837244   ...

...

X   longitude   latitude   label     2019-01-12   2019-01-28   ...
1   -56.58652   -30.87850  cropland  0.08367160   0.07883158   ...  
2   -56.58458   -30.88260  cropland  0.07888613   0.07438400   ...  
3   -56.58429   -30.87860  cropland  0.08331446   0.07837244   ...

我需要为 8 个数据帧执行此操作,如上面的示例。 我知道,这应该是非常基本的,但我对 R 和一般编程也很陌生。所以我很感谢任何关于那个的提示! 干杯!

【问题讨论】:

  • 这将有助于准确了解您的列名(看起来像日期,以数字开头 - 没有字母,对吗?)您能否编辑您的问题并使用 dput(df[1:10, 1:10]) 并提供实际数据在前 10 行和列上重现?

标签: r dataframe subset


【解决方案1】:

您可以使用 split.default 根据年份拆分数据,并使用 lapply cbind 每个列表的前四列。

result <- lapply(split.default(df[-(1:4)], 
                 format(as.Date(names(df)[-(1:4)], 'X%Y.%m.%d'), '%Y')), 
                 function(x) cbind(df[1:4], x))

R 试图阻止以数字开头的列名,因此如果您使用默认选项读取数据,它会将列名从2007-01-07 更改为X2007.01.07,因此请记住,我在as.Date 中使用了'X%Y.%m.%d'。如果您以某种方式设法读取了显示的列名,即2007-01-07,请在as.Date 中使用%Y-%m-%d

【讨论】:

    猜你喜欢
    • 2018-11-25
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    相关资源
    最近更新 更多