微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

每两列对数据框的列应用一个函数,将该函数的结果存储在一个列表中,然后将该列表作为列插入 数据

如何解决每两列对数据框的列应用一个函数,将该函数的结果存储在一个列表中,然后将该列表作为列插入 数据

所以我有一个 6 列的数据框,它们都是数字且长度相同。数据框如下所示:

df <- data.frame(var1 = 1:10,var2 = 5:15,var3 = 7:17,var4 = 3:13,var5 = 20:30,var6 = 15:25)
print(df)

我想要做的是取 var1 和 var2 并减去它们(var1 - var2),然后在一个新列中得到结果,该列将在 var2 之后将自身插入同一数据帧中。然后我想取 var3 和 var4 并减去它们(var3 - var4),然后在一个新列中得到结果,我将在 var4 之后插入该列,依此类推。

有什么建议吗?

解决方法

来自.after的{​​{1}}中有mutate,可以使用

dplyr

-输出

library(dplyr)
df %>% 
   mutate(var12 = var1 - var2,.after = var2) %>%
   mutate(var34 = var3 - var4,.after = var4)

如果我们需要在每 2 列之后创建列

#    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

-输出

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]))
   } 
        

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 中,我们也可以做

base R

然后我们根据列名out1 <- df[c(FALSE,TRUE)] - df[c(TRUE,FALSE)] names(out1) <- paste0(names(out1),"_",names(df)[c(TRUE,FALSE)]) 数据集和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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。