【问题标题】:Create a new variable using dplyr [duplicate]使用 dplyr 创建一个新变量 [重复]
【发布时间】:2021-08-20 14:36:46
【问题描述】:

我想在数据集中创建一个新变量,它是使用 dplyr mutate 在数据集中已经存在的变量的第一个差异。

我正在使用示例数据 MaunaLoa

MaunaLoa = read.csv("http://course1.winona.edu/bdeppa/FIN%20335/Datasets/CO2%20Mauna%20Loa.csv")

当我只是转换变量时,命令 dplyr 起作用:

MaunaLoa <- dplyr::mutate(MaunaLoa, lnCO2 = log(CO2))

但如果我试图创建一个新变量,它是现有变量的第一个区别:

MaunaLoa <- dplyr::mutate(MaunaLoa, CO2_diff = diff(CO2), na.omit=TRUE)

我收到以下错误消息:

CO2_diff must be size 468 or 1, not 467

有什么我可以指定不让它崩溃的吗?

【问题讨论】:

  • 错误信息给出了线索​​:长度为 n 的向量只产生 (n-1) 个差异。 dplyr 不能明智地回收它。解决方案很简单:提供一个额外的价值。由于 tibble 的 first 行没有前任,因此将此行的差异设置为 NA。所以:MaunaLoa &lt;- dplyr::mutate(MaunaLoa, CO2_diff = c(NA, diff(CO2))).

标签: r dplyr


【解决方案1】:

我们可以使用 lag 和参数 default。 Limey see cmets 给出了解释:

library(dplyr)
MaunaLoa %>% 
    mutate(CO2_diff2 = (diff= CO2-lag(CO2,default=first(CO2))))
     Time Month  Year   CO2 lnCO2 CO2_diff2
   <int> <int> <int> <dbl> <dbl>     <dbl>
 1     1     1  1959  315.  5.75     0    
 2     2     2  1959  316.  5.76     0.890
 3     3     3  1959  316.  5.76     0.190
 4     4     4  1959  318.  5.76     1.06 
 5     5     5  1959  318.  5.76     0.570
 6     6     6  1959  318   5.76    -0.130
 7     7     7  1959  316.  5.76    -1.61 
 8     8     8  1959  315.  5.75    -1.74 
 9     9     9  1959  314.  5.75    -0.970
10    10    10  1959  313.  5.75    -0.5  
# ... with 458 more rows

【讨论】:

    【解决方案2】:

    函数diff() 返回一个总是比它处理的列表短的向量。在这种情况下,您滞后 1(第一个差异),您需要填写“第一个点”,可能使用 NA 或 0。在我的示例中,我使用 NA。

    mutate(MaunaLoa, lnCO2 = log(CO2), 
       CO2_diff = c(NA, diff(CO2)), na.omit = TRUE)
    
    # A tibble: 468 x 7
        Time Month  Year   CO2 lnCO2 CO2_diff na.omit
       <dbl> <dbl> <dbl> <dbl> <dbl>    <dbl> <lgl>  
     1     1     1  1959  315.  5.75   NA     TRUE   
     2     2     2  1959  316.  5.76    0.890 TRUE   
     3     3     3  1959  316.  5.76    0.190 TRUE   
     4     4     4  1959  318.  5.76    1.06  TRUE   
     5     5     5  1959  318.  5.76    0.570 TRUE   
     6     6     6  1959  318   5.76   -0.130 TRUE   
     7     7     7  1959  316.  5.76   -1.61  TRUE   
     8     8     8  1959  315.  5.75   -1.74  TRUE   
     9     9     9  1959  314.  5.75   -0.970 TRUE   
    10    10    10  1959  313.  5.75   -0.5   TRUE   
    # ... with 458 more rows
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 2019-03-01
      相关资源
      最近更新 更多