简体   繁体   English

每两列将 function 应用于 dataframe 的列,将 function 的结果存储在列表中,然后将该列表作为列插入

[英]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 useddplyr 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 dobase 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

data数据

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.

相关问题 R - 使用 map 将列表函数应用于数据框列并使用列表元素创建新列 - R - using map to apply a list function to dataframe column and create new columns with elements of the list 在R中应用列的功能列表 - Apply a function list of columns in R R 使用 purrr::map 在数据框列表中的选定列上应用函数 - R use purrr::map to apply a function on a selected columns in a dataframe list 将函数应用于数据框列表中的列并附加结果 - Apply function to columns in a list of data frames and append results 跨两个嵌套列表列应用数学函数 - Apply mathematical function across two nested list-columns 用于将数据框列中的所有列表元素提取到单个列的功能 - Function to extract all list elements from a dataframe column into individual columns 将使用数据框中的列作为输入的函数应用于1:n列和行上的每个值 - Apply a function that uses a column in the dataframe as input to every value on 1:n columns and rows 将函数应用于数据框列表和匹配模式的列 - Apply function to list of dataframes and columns matching pattern 将创建列功能应用于列表r - apply create columns function to a list r 如何将 function 应用于列表中 dataframe 中的每个元素,并在 Z6A8064B5DF4794555500553C47C55057DZ 中返回 dataframe - How to apply a function to every element in a dataframe in a list and return a dataframe in R?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM