如何使用R和dplyr同时为多个新列分配值?

时间:2017-12-19 22:05:12

标签: r dplyr

鉴于

base <- data.frame( a = 1) 
f <- function() c(2,3,4)

我正在寻找能够将函数f应用于base数据帧的每一行的解决方案,并将结果附加到每一行。以下两种方法均无效:

result <- base %>% rowwise() %>% mutate( c(b,c,d) = f() )
result <- base %>% rowwise() %>% mutate( (b,c,d) = f() )
result <- base %>% rowwise() %>% mutate( b,c,d = f() )

此任务的正确语法是什么?

这似乎是一个类似的问题(Assign multiple new variables on LHS in a single line in R),但我特别感兴趣的是用tidyverse的函数解决这个问题。

2 个答案:

答案 0 :(得分:3)

我认为您要做的最好的事情是do()来修改data.frame。也许

base %>% do(cbind(., setNames(as.list(f()), c("b","c","d"))))
如果f()首先返回不同列的列表,那么

可能是最佳的。

答案 1 :(得分:0)

如果您愿意在没有dplyr的情况下这样做:

# starting data frame
base_frame <- data.frame(col_a = 1:10, col_b = 10:19)

# the function you want applied to a given column 
add_to <- function(x) { x + 100 } 

# run this function on your base data frame, specifying the column you want to apply the function to:
add_computed_col <- function(frame, funct, col_choice) {
  frame[paste(floor(runif(1, min=0, max=10000)))] = lapply(frame[col_choice], funct)
  return(frame)
}

用法:

df <- add_computed_col(base_frame, add_to, 'col_a')
head(df)

enter image description here

根据需要添加尽可能多的列:

df_b <- add_computed_col(df, add_to, 'col_b')
head(df_b)

enter image description here

重命名列。