[英]How to create an equation in the dplyr::mutate function in R?
我有一個關於在現實世界項目中使用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 = "") ="
請幫助我使此正確。 我也嘗試過用貓代替粘貼。
一個基於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)
使用@www的數據,您也可以嘗試
res <- sapply(seq(3, ncol(dat), 2), function(x, y) y[x] - y[c(x+1)], dat)
cbind.data.frame(dat, setNames(res, paste0(names(res), "_diff")))
group time A_1 A_3 B_1 B_3 C_1 C_3 A_1_diff B_1_diff C_1_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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.