r - 如何在 R 的 dplyr::mutate 函数中创建方程?
问题描述
我有一个关于在我的真实项目中使用 mutate 函数的问题。我的数据如下。
group time A_1 A_3 B_1 B_3 C_1 C_3
1 100 7 5 7 3 5 3
1 200 8 4 5 6 1 2
1 300 5 6 8 9 2 1
1 400 3 5 7 8 2 1
2 100 3 5 7 6 3 2
2 200 4 5 6 0 1 4
2 300 3 3 4 5 3 2
2 400 6 5 3 1 3 7
我将数据集称为 dat。我正在尝试计算每个 A、B 或 C 类型的两列之间的差异,即 A_diff = A_1 - A_3、B_diff = B_1 - B_3、C_diff = C_1 - C_3 等。我的类型比这里显示的要多,有多少不同的类型是不固定的。所以我想使用下面的代码在 mutate 函数中制作一个灵活的方程。
type = c("A", "B", "C")
for(i in type){
dat = mutate(dat, paste(i, "_diff", sep = "") = paste(i, "_1", sep = "") - paste(i, "_3", sep = "")
}
但是,我收到一条错误消息,显示意外的“=”。
Error: unexpected '=' in "dat = mutate(dat, paste(i, "diff", sep = "") ="
请帮我改正。我也尝试过 cat 而不是 paste 。
解决方案
一个基于gather
和spread
计算差异然后left_join
到原始数据帧的解决方案。
library(dplyr)
library(tidyr)
dat2 <- dat %>%
gather(Column, Value, -group, -time) %>%
separate(Column, into = c("Letter", "Number"), sep = "_") %>%
spread(Number, Value) %>%
mutate(Diff = `1` - `3`) %>%
mutate(Letter = paste0(Letter, "_diff")) %>%
select(-`1`, -`3`) %>%
spread(Letter, Diff) %>%
left_join(dat, ., by = c("group", "time"))
dat2
# group time A_1 A_3 B_1 B_3 C_1 C_3 A_diff B_diff C_diff
# 1 1 100 7 5 7 3 5 3 2 4 2
# 2 1 200 8 4 5 6 1 2 4 -1 -1
# 3 1 300 5 6 8 9 2 1 -1 -1 1
# 4 1 400 3 5 7 8 2 1 -2 -1 1
# 5 2 100 3 5 7 6 3 2 -2 1 1
# 6 2 200 4 5 6 0 1 4 -1 6 -3
# 7 2 300 3 3 4 5 3 2 0 -1 1
# 8 2 400 6 5 3 1 3 7 1 2 -4
或者您可以使用以下lapply
基于 - 的方法。
re <- lapply(c("A", "B", "C"), function(x){
dat[[paste0(x, "_1")]] - dat[[paste0(x, "_3")]]
})
names(re) <- paste0(c("A", "B", "C"), "_diff")
dat2 <- cbind(dat, as.data.frame(re))
dat2
# group time A_1 A_3 B_1 B_3 C_1 C_3 A_diff B_diff C_diff
# 1 1 100 7 5 7 3 5 3 2 4 2
# 2 1 200 8 4 5 6 1 2 4 -1 -1
# 3 1 300 5 6 8 9 2 1 -1 -1 1
# 4 1 400 3 5 7 8 2 1 -2 -1 1
# 5 2 100 3 5 7 6 3 2 -2 1 1
# 6 2 200 4 5 6 0 1 4 -1 6 -3
# 7 2 300 3 3 4 5 3 2 0 -1 1
# 8 2 400 6 5 3 1 3 7 1 2 -4
数据
dat <- read.table(text = "group time A_1 A_3 B_1 B_3 C_1 C_3
1 100 7 5 7 3 5 3
1 200 8 4 5 6 1 2
1 300 5 6 8 9 2 1
1 400 3 5 7 8 2 1
2 100 3 5 7 6 3 2
2 200 4 5 6 0 1 4
2 300 3 3 4 5 3 2
2 400 6 5 3 1 3 7",
header = TRUE, stringsAsFactors = FALSE)
推荐阅读
- javascript - 新反应无法启动服务器收到错误消息知道吗?
- vue.js - 如何在 vuejs 中重新挂载子组件
- xamarin.ios - 如何在 xamarin.forms iOS 中配置 WkWebView?
- python - Python randint 生成具有相同位数的数字
- vba - 变体和 if 语句 - VBA
- java - 提交从数据库中提供数据的搜索表单后如何解析 Html
- flutter - Dart 中的日期格式,包括 GMT
- javascript - 如何使用 d3.js 在画布中移动元素时减少延迟
- java - 如何以最优雅的方式找到具有最大价值的对象?
- loopback4 - Loopback 4 授权提供程序不起作用