使用tidyverse,如何动态生成新列?
假设我有一个由数十列组成的数据帧,我的自定义函数需要这些列中的每一列加上向量中的一个数字,以获得所需的输出。完成所有这些之后,我需要基于dataframe中的原始列名生成新列名。如何使用使用tidyverse,如何动态生成新列?,r,function,dataframe,dynamic,tidyverse,R,Function,Dataframe,Dynamic,Tidyverse,假设我有一个由数十列组成的数据帧,我的自定义函数需要这些列中的每一列加上向量中的一个数字,以获得所需的输出。完成所有这些之后,我需要基于dataframe中的原始列名生成新列名。如何使用tidyverse,而不是for循环或base R中的其他解决方案来完成此操作 MWE structure(list(col1 = c(36.0520583373645, 37.9423749063706, 33.6806634587719, 34.031649012457, 29.5448679963449,
tidyverse
,而不是for
循环或base R
中的其他解决方案来完成此操作
MWE
structure(list(col1 = c(36.0520583373645, 37.9423749063706, 33.6806634587719,
34.031649012457, 29.5448679963449, NA, 34.7576769718877, 30.484217745574,
32.9849083643022, 27.4081694831058, 35.8624919654559, 35.0284347997991,
NA, 32.112605893241, 27.819354948082, 35.6499532124921, 35.0265642403216,
32.4006569441297, 30.3698557864842, 31.8229364456928, 34.3715903109276
), col2 = c(32.9691195198199, 35.6643664156284, 33.8748732989736,
34.5436311813644, 33.2228201914256, 38.7621696867191, 34.8399804318992,
32.9063078995457, 35.7391166214367, 32.7217251282669, 36.3039268989853,
35.9607654868559, 33.1385915196435, 34.7987649028199, 33.7100463668523,
34.7773403671057, 35.8592997980752, 33.8537127786535, 31.9106243803505,
39.3099469314882, 35.1849826815196), col3 = c(33.272278716963,
NA, 31.8594920410129, 33.1695042551974, 29.3800694974438, 35.1504378875245,
34.0771487001433, 29.0162879030415, 30.6960024888799, 29.5542117965184,
34.3726321365982, 36.0602274148362, 33.1207772548047, 31.5506876209822,
28.8649303491974, 33.4598790144265, 30.5573454464747, 31.6026723913051,
30.4716061556625, 33.009463000301, 30.846230953425)), row.names = c(NA,
-21L), class = "data.frame")
将上面的内容保存到文件中,然后使用
示例tidyverse
对于这些类似于扫描()
的操作来说不是很好,但是,一个选项可以是:
example %>%
do(., sweep(., 2, FUN = customfun, y)) %>%
rename_all(~ paste(., "log", sep = "."))
col1.log col2.log col3.log
1 7.169928 3.495571 5.257087
2 7.272137 3.574152 NA
3 7.033848 3.522674 5.192003
4 7.054582 3.542223 5.252446
5 6.771820 3.503237 5.070475
6 NA 3.657445 5.339456
7 7.096801 3.550766 5.292941
8 6.834418 3.493664 5.051786
9 6.992100 3.576246 5.136199
10 6.621682 3.488039 5.079339
我们可以使用map2
和bind\u cols
添加新列
library(dplyr)
library(purrr)
bind_cols(example, map2_df(example, y, customfun) %>%
rename_all(~paste0(., ".log")))
# col1 col2 col3 col1.log col2.log col3.log
#1 36.05206 32.96912 33.27228 7.169928 3.495571 5.257087
#2 37.94237 35.66437 NA 7.272137 3.574152 NA
#3 33.68066 33.87487 31.85949 7.033848 3.522674 5.192003
#4 34.03165 34.54363 33.16950 7.054582 3.542223 5.252446
#...
有可能保留原始列吗?我想说,只做一个列绑定比较容易,比如example%%>%do(,sweep(,2,FUN=customfun,y))%%>%rename\u all(~paste(,,“log”,sep=“。”))%%>%bind\u cols(example)
。好吧,我的朋友会想出另一个答案的@tmfmnk你能帮我写这首在呼噜森林里写的好诗吗,我想知道map2_-df
与另一个邻居map2_-dfc
有什么不同,它似乎给出了类似的结果?@博士学位是的,在这种情况下,您可以使用map2_-df
/map2_-dfc
/map2_-dfr
中的任何一种,它将给出相同的输出。在列表上操作时,输出不同。
library(dplyr)
library(purrr)
bind_cols(example, map2_df(example, y, customfun) %>%
rename_all(~paste0(., ".log")))
# col1 col2 col3 col1.log col2.log col3.log
#1 36.05206 32.96912 33.27228 7.169928 3.495571 5.257087
#2 37.94237 35.66437 NA 7.272137 3.574152 NA
#3 33.68066 33.87487 31.85949 7.033848 3.522674 5.192003
#4 34.03165 34.54363 33.16950 7.054582 3.542223 5.252446
#...