【问题标题】:Easy way to transform data frame in R - one variable values as separate columns [duplicate]在 R 中转换数据框的简单方法 - 一个变量值作为单独的列 [重复]
【发布时间】:2016-05-05 18:51:44
【问题描述】:

我所拥有的(显然我只展示了我当前数据的一小部分):

my_df <- structure(list(X = structure(c(48.75, 49.25), .Dim = 2L), Y = structure(c(17.25, 17.25), .Dim = 2L), Time = structure(c(14625, 14626), .Dim = 2L, class = "Date"), spei = c(-0.460236400365829, -0.625695407390594)), .Names = c("X", "Y", "Time", "spei"), row.names = 1:2, class = "data.frame")

我需要什么:

new_df <- structure(list(X = structure(c(48.75, 49.25), .Dim = 2L), Y = structure(c(17.25, 17.25), .Dim = 2L), "2010-01-16" = c(-0.460236400365829, NaN), "2010-01-17" = c(NaN, -0.625695407390594)), .Names = c("X", "Y", "2010-01-16", "2010-01-17"), row.names = 1:2, class = "data.frame")

最简单的方法是什么? 我想过写一个 for 循环,但我想 apply/sapply 可能对此有所帮助?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    您可以像这样使用库tidyr 及其spread 函数:

    library(tidyr)
    spread(my_df, Time, spei)
          X     Y 2010-01-16 2010-01-17
    1 48.75 17.25 -0.4602364         NA
    2 49.25 17.25         NA -0.6256954
    

    【讨论】:

    • 我喜欢这个解决方案,而不是重塑。但是,是否有任何参数可以按日期对列进行排序?
    • 您可以使用orderdplyrarrange对日期列上的数据框进行预排序,然后进行传播。
    【解决方案2】:

    没有任何额外的包你可以用reshape()做到这一点:

    reshape(my_df, idvar = c('X', 'Y'), timevar = "Time", direction = 'wide')
    

    这给出了:

          X     Y spei.2010-01-16 spei.2010-01-17
    1 48.75 17.25      -0.4602364              NA
    2 49.25 17.25              NA      -0.6256954
    

    【讨论】:

      猜你喜欢
      • 2014-02-17
      • 1970-01-01
      • 2018-03-15
      • 2023-03-16
      • 2015-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多