[英]Apply a function to the columns of a dataframe every two columns, store the results of that function in a list, and then insert that list as a column
So I have a dataframe of 6 columns, all of them numeric and of the same length.所以我有一个 6 列的 dataframe,它们都是数字且长度相同。 The dataframe look like this:
dataframe 看起来像这样:
df <- data.frame(var1 = 1:10, var2 = 5:15, var3 = 7:17, var4 = 3:13, var5 = 20:30, var6 = 15:25)
print(df)
What I want to do is to take var1 and var2 and substract them (var1 - var2) and get the result from that in a new column that will insert itself in the same dataframe just after var2.我想要做的是获取 var1 和 var2 并减去它们(var1 - var2),然后在一个新列中得到结果,该列将在 var2 之后插入同一个 dataframe 中。 Then I want to take var3 and var4 and substract them (var3 - var4) and get the result from that in a new column that I will insert just after var4, and so on.
然后我想取 var3 和 var4 并减去它们 (var3 - var4) 并在新列中得到结果,我将在 var4 之后插入,依此类推。
Any suggestions?有什么建议么?
There is .after
in mutate
from dplyr
, which can be used从
dplyr
mutate
后有.after
,可以使用
library(dplyr)
df %>%
mutate(var12 = var1 - var2, .after = var2) %>%
mutate(var34 = var3 - var4, .after = var4)
-output -输出
# var1 var2 var12 var3 var4 var34 var5 var6
#1 1 5 -4 7 3 4 20 15
#2 2 6 -4 8 4 4 21 16
#3 3 7 -4 9 5 4 22 17
#4 4 8 -4 10 6 4 23 18
#5 5 9 -4 11 7 4 24 19
#6 6 10 -4 12 8 4 25 20
#7 7 11 -4 13 9 4 26 21
#8 8 12 -4 14 10 4 27 22
#9 9 13 -4 15 11 4 28 23
#10 10 14 -4 16 12 4 29 24
#11 11 15 -4 17 13 4 30 25
If we need to create columns after every 2 columns如果我们需要在每 2 列之后创建列
library(stringr)
out <- df
for(i in seq(2, ncol(df), by = 2)) {
out <- out %>%
mutate(!! str_c('var', i-1, i) :=
.[[names(df)[i]]] - .[[names(df)[i-1]]],
.after = all_of(names(df)[i]))
}
-output -输出
out
# var1 var2 var12 var3 var4 var34 var5 var6 var56
#1 1 5 4 7 3 -4 20 15 -5
#2 2 6 4 8 4 -4 21 16 -5
#3 3 7 4 9 5 -4 22 17 -5
#4 4 8 4 10 6 -4 23 18 -5
#5 5 9 4 11 7 -4 24 19 -5
#6 6 10 4 12 8 -4 25 20 -5
#7 7 11 4 13 9 -4 26 21 -5
#8 8 12 4 14 10 -4 27 22 -5
#9 9 13 4 15 11 -4 28 23 -5
#10 10 14 4 16 12 -4 29 24 -5
#11 11 15 4 17 13 -4 30 25 -5
In base R
, we can also do在
base R
中,我们也可以这样做
out1 <- df[c(FALSE, TRUE)] - df[c(TRUE, FALSE)]
names(out1) <- paste0(names(out1), "_", names(df)[c(TRUE, FALSE)])
and then we cbind
the datasets and order
based on the column name然后我们根据列名
cbind
数据集和order
out2 <- cbind(df, out1)
out3 <- out2[gtools::mixedorder(names(out2))]
out3
# var1 var2 var2_var1 var3 var4 var4_var3 var5 var6 var6_var5
#1 1 5 4 7 3 -4 20 15 -5
#2 2 6 4 8 4 -4 21 16 -5
#3 3 7 4 9 5 -4 22 17 -5
#4 4 8 4 10 6 -4 23 18 -5
#5 5 9 4 11 7 -4 24 19 -5
#6 6 10 4 12 8 -4 25 20 -5
#7 7 11 4 13 9 -4 26 21 -5
#8 8 12 4 14 10 -4 27 22 -5
#9 9 13 4 15 11 -4 28 23 -5
#10 10 14 4 16 12 -4 29 24 -5
#11 11 15 4 17 13 -4 30 25 -5
df <- structure(list(var1 = 1:11, var2 = 5:15, var3 = 7:17, var4 = 3:13,
var5 = 20:30, var6 = 15:25), class = "data.frame", row.names = c(NA,
-11L))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.