【问题标题】:How to reference a given line to create a variable in base 100如何引用给定的行以创建以 100 为底的变量
【发布时间】:2021-06-05 22:03:57
【问题描述】:

我有一个这样的数据表:

library(tidyverse)
library(lubridate)
library(data.table)

DT <- data.table( 
  "Date"=rep(seq(ymd('2000-01-01'),ymd('2020-12-01'), by = '1 month'),3),
  "Country"=rep(c("France","Germany","Italy"),each=21*12),
  "Population"=rep(seq(from=10000,to=(10000+21*12-1)),3))

(是的,我并没有真正受到启发来模拟人口)。

现在我想要一个新变量,例如population2,但在 2000 年初缩减为 value = 100,并且针对每个国家/地区(即使它们在这里相同)。 这样每个值都会有Population2:=100*Population/Population{for the given country, at date=2000-01-01}

【问题讨论】:

    标签: r data.table data-manipulation


    【解决方案1】:

    如果日期没有丢失且已排序,则使用first 返回人口的第一个值,按“国家/地区”分组

    DT[, Population2 := 100 * Population/first(Population), by = Country]
    

    或者如果没有订购,我们也可以使用i根据'Date'做order

    DT[order(Date), Population2 := 100 * Population/first(Population), by = Country]
    

    或者也可以使用==按特定的“日期”作为子集

    DT[, Population2 := if("2000-01-01" %in% Date) {
            100 * Population/Population[Date == "2000-01-01"]
             } else NA_real_, by = Country]
    

    或者另一个选项是基于“日期”的子集后的连接

    DT[DT[Date == "2000-01-01"], Population2 := Population/i.Population, 
              on = .(Country)]
    

    【讨论】:

    • first() 选项很有趣,在某些情况下很有用,但我改变了我的问题。如果选择的日期是第一个,也许可以将其作为一个选项,这通常是这种情况。当延迟允许我时,我还是接受答案:)!
    • @AnthonyMartin 不会在这些情况下使用第 3 和第 4 选项
    • @AnthonyMartin 为第三个选项添加了带有if/else 的条件
    • 您的意思是留下我最初的问题,而您的回答涵盖更一般的情况将是处理该问题的最佳方法?
    • @AnthonyMartin 第一个和第二个选项假定每个国家/地区都存在“2000-01-01”并且它是最小日期。如果该日期不可用,如在第三个选项中,它会为这些组返回一个 NA,而在第四个中,它会自动返回,因为它是由“2000-01-01”子集的,所以对于那些没有那个的国家,这将是 NA
    【解决方案2】:

    使用match

    library(data.table)
    date_to_compare <- as.Date('2000-01-01')
    
    DT[, Population2 := 100 * Population/Population[match(date_to_compare, Date)], Country]
    DT
    
    #           Date Country Population Population2
    #  1: 2000-01-01  France      10000      100.00
    #  2: 2000-02-01  France      10001      100.01
    #  3: 2000-03-01  France      10002      100.02
    #  4: 2000-04-01  France      10003      100.03
    #  5: 2000-05-01  France      10004      100.04
    # ---                                          
    #752: 2020-08-01   Italy      10247      102.47
    #753: 2020-09-01   Italy      10248      102.48
    #754: 2020-10-01   Italy      10249      102.49
    #755: 2020-11-01   Italy      10250      102.50
    #756: 2020-12-01   Italy      10251      102.51
    

    【讨论】:

      猜你喜欢
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 2020-07-14
      • 2014-11-03
      相关资源
      最近更新 更多