鉴于
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的函数解决这个问题。
答案 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)
根据需要添加尽可能多的列:
df_b <- add_computed_col(df, add_to, 'col_b')
head(df_b)
重命名列。