[英]Create multiple columns with mutate (dplyr) in R using rollapplyr function
[英]R: Using dplyr to Mutate Multiple Columns
关于堆栈溢出有很多与此有关的问题,但是我一直无法找到解决问题的方法。
假设我有一个包含两列的数据帧(或小标题) df
,例如X1
和X2
。 我有一个函数f
,它接受输入X1
和X2
并输出一个向量 [V1, V2]
。 现在,如果输出是单例,那么我将能够写
df %>% mutate(V = f(X1,X2))
将标记为V
的列添加到我的df
,条目将为f(X1,X2)
。 但是,我想添加两列V1
和V2
。 我不知道该怎么做。
当然,我可以做类似的事情
df %>% mutate(V1 = f(X1,X2)[1], V2 = f(X1,X2)[2]),
但这(我假设)涉及到两次调用函数f
; 我有一个很大的数据集,宁愿不叫它两次。 或者,我可以做
df %>% mutate(V_list = as.list(f(X1,X2)), V1 = V_list[[1]], V2 = V_list[[2]]) %>% select(-V_list),
但这似乎是一种笨拙的方式,而我宁愿不这样做。
此外,我最终希望将其应用于group
ed tibble,因此,天真的编写方法将为组中的每个条目复制V_list
。 因此,从以下意义上讲,理想的答案是“矢量化的”。 假设我已经完成了df %>% group_by(var1)
并具有一个函数f
,该函数将一个包含两列的数据框作为输入-这应该被视为“成对向量”-然后输出一个新数据两列的框架。
这是一些设置示例的代码。
library(dplyr)
df = tibble(var1 = c(1,1,2,2), X1 = c(1,2,3,4), X2 = c(5,6,7,8))
f = function(sub_df, var){ return( data.frame(x1 = (x1+x2)^var, x2 = (x1-x2)^var) ) }
使用tidyr 1.0.0,您可以使用unnest_wider
修改函数,以便将输出命名为
f = function(x1,x2) c(a = x1 + x2, b = x1 - x2)
创建一个新列,该列是一个包含每行向量的列表,然后将unnest_wider
应用于此列,以将向量元素拆分为自己的列。
df %>%
mutate(new = map2(X1, X2, f)) %>%
unnest_wider(new)
# # A tibble: 4 x 5
# var1 X1 X2 a b
# <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 1 1 5 6 -4
# 2 1 2 6 8 -4
# 3 2 3 7 10 -4
# 4 2 4 8 12 -4
这可能不是理想的解决方案,但是我已经遇到了这种情况,这是我通常要做的。 从函数返回一个分隔符分隔的字符串和separate
基于该定界符的列。
f = function(x1,x2){ return( toString(c(x1+x2, x1-x2))) }
library(tidyverse)
df %>%
mutate(new = map2_chr(X1, X2, f)) %>%
separate(new, c("col1", "col2"), sep = ",", convert = TRUE)
# A tibble: 2 x 4
# X1 X2 col1 col2
# <dbl> <dbl> <int> <int>
#1 1 3 4 -2
#2 2 4 6 -2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.