15.关于mutate()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了15.关于mutate()相关的知识,希望对你有一定的参考价值。

参考技术A

【上一篇:14.关于select()】
【下一篇:16.关于summarise()之一】

    mutate()函数也是一个对列进行操作的函数。重申:目前为止,我们已经学习了filter(),arrange(),select()函数,前两者是对数据框的行(观测值)进行的操作,列不变;select()是对数据框的列(变量)操作,行不变。
    mutate()函数的title是 Create, modify, and delete columns 。本篇中会讲到两个函数mutate()和transmute():
    1. mutate()函数增加新列并保留已存在的列
    2. transmute()函数增加新列但会丢掉之前存在的列
    3. 如果新变量的名字和已知变量相同,则会直接覆盖之前的内容(modify体现在此处)
    4. 可以通过将变量设置为NULL来删除列(delete体现在此处)
    mutate()的两种用法:

    transmute()只会返回新计算得到的列:

    有很多函数可以和mutate()一起连用帮助我们创建新的列,前提是这些函数必须接受一个向量,然后返回一个和输入向量相等长度的向量,如果参与运算的多个向量长度不等,则会自动补齐到同样长度。几种常用的函数如下:
    1. 算术运算符
    包括:+(加)、-(减)、*(乘)、/(除)、^(幂)
    2. 模运算(Modular arithmetic)
    包括:%/% (integer division,取整) and %% (remainder,取余)。
    例如:

    3. 对数运算
    包括:log()、log2()、log10()。对数运算可以处理值跨越多个数量集范围的数据集。也可以将乘法关系转换为加法关系。

    4. Offsets
    包括:lag()和lead()函数,title是 Compute lagged or leading values-计算滞后值或前导值 ,Find the "previous" (lag()) or "next" (lead()) values in a vector. Useful for comparing values behind of or ahead of the current values.帮助文档:

    5. Cumulative and rolling aggregates
    包括cumulative aggregats:计算running和、running乘积、running最大、running最小值、累积平均值的函数:cumsum(), cumprod(), cummin(), cummax()、cummean()。它们的输入参数都是一个向量。running在这里可以理解为动态的意思。其中cummean()函数在dplyr包中。rolling aggregates相关的计算函数在RcppRoll包中。
    PS:cumulative是累计求和,求平均等;rolling是在一个滚动的窗口内进行计算,划窗?

    6. 逻辑比较
    包括:>,>=,<,<=,==,!=
    7. Ranking
    很多ranking函数,包括min_rank()、row_number()、dense_rank()、percent_rank()、cume_dist()、ntile()。
    再次脑子不够用,刨坑....

    小练习
    1.将flights数据集中的dep_time和sched_dep_time变成从midnight开始的分钟的形式。(我会了)
    2. air_time和arr_time - dep_time比较会有什么样的结果?是你想要的吗?怎么得到你想要的呢?(arr_time -dep_time得到的是飞机在路途中的时间,但是是HHMM格式的,air_time是分钟形式的。但即使我转换之后两者还是不相等,我不知道为什么?)
    3.用rank函数找到10个最延迟的航班(用min_rank(),但今天不填坑)
    4. R提供了什么样的三角函数?
    5. 1:3 + 1:10结果如何?

【上一篇:14.关于select()】
【下一篇:16.关于summarise()之一】

用 mutate 函数替换条件下的值

【中文标题】用 mutate 函数替换条件下的值【英文标题】:replace values under condition with mutate function 【发布时间】:2021-07-18 03:38:13 【问题描述】:

我正在尝试在数据帧上运行一个简单的 mutate() 函数,以在其他列的条件下对一列的 replace 值。 大约一周后出现的问题是 mutate 函数除了我试图替换的第一个值之外没有任何改变。 没有错误消息,代码照常运行,但生成的数据框的值没有改变。 由于我与mutate() 合作多年,我真的不知道出了什么问题。

有没有其他人有同样的问题或知道如何解决这个问题?

library(plyr)
library(dplyr)

df <- data.frame(var1 = rep(c(1:10),2),
                 var2 = rep(c(0,1), 10),
                 var3 = rep(c("2010", "2015", "2020", "2025"),5),
                 stringsAsFactors = FALSE)

df1 <- df %>% 
        mutate(var1 = replace(var1, var2 == "1" & var3 == "2015", "20"),
               var1 = replace(var1, var2 == "0" & var3 == "2020", "0))

现在它不会以我想要的 var1 值返回 df1,而只会复制 df,因此 var1 保持不变。

谢谢!

【问题讨论】:

1) plyr 已退休,您可以单独使用 dplyr 完成大部分事情(所有事情)。此外,加载plyr 可能会与dplyr 中的某些功能冲突(如summarise/mutate)。 2) 您的第二个 replace 声明中缺少 "。纠正这个问题能解决问题吗? 感谢您的回答!我只跑了dplyr 并且它起作用了。当我同时加载dplyrplyr 时,问题似乎出现了。我想我在同一个 R 会话中使用了 plyr 包进行另一个操作,这导致了错误。我会为此提出,从现在开始只使用dplyr 【参考方案1】:

这会产生您想要的输出吗?您的问题并不清楚,我没有足够的声誉点来发表评论。

df <- data.frame(var1 = rep(c(1:10),2),
                 var2 = rep(c(0,1), 10),
                 var3 = rep(c("2010", "2015", "2020", "2025"),5),
                 stringsAsFactors = FALSE)

df1 <- df %>% 
  mutate(var1 = replace(var1, var2 == "1" & var3 == "2015", "20")) %>%
  mutate(var1 = replace(var1, var2 == "0" & var3 == "2020", "0"))

head(df1)

#    var1 var2 var3
# 1    1    0 2010
# 2   20    1 2015
# 3    0    0 2020
# 4    4    1 2025
# 5    5    0 2010
# 6   20    1 2015


【讨论】:

感谢您的回答!我刚刚通过上面的方案解决了问题!

以上是关于15.关于mutate()的主要内容,如果未能解决你的问题,请参考以下文章

你能让 dplyr::mutate 和 dplyr::lag 默认 = 自己的输入值吗?

在列的子集上执行dplyr mutate

如何在具有多个参数的自定义函数中使用 mutate

关于升级 macOS 10.15.4

关于在 15 方谜题中使用 A* 的问题

关于*** WARNING L15: MULTIPLE CALL TO SEGMENT解决方案