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
并且它起作用了。当我同时加载dplyr
和plyr
时,问题似乎出现了。我想我在同一个 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()的主要内容,如果未能解决你的问题,请参考以下文章