首页 > 解决方案 > 使用 mutate 和 lapply 简化语法

问题描述

我有创建新数据框 df2 的代码,它是现有数据框 df 的副本,但有四个新列 a、b、c、d。这些列的值由它们自己的函数给出。

下面的代码按预期工作,但似乎重复。有没有更简洁的形式可以推荐?

df2 <- df %>% mutate(a = lapply(df[,c("value")], f_a), 
                     b = lapply(df[,c("value")], f_b), 
                     c = lapply(df[,c("value")], f_c), 
                     d = lapply(df[,c("value")], f_d)
)

“值”列中的单元格内容示例"-0.57(-0.88 to -0.26)"。我正在应用一个函数来提取第一个数字:

f_a <- function(x){
    substring(x, 1, regexpr("\\(", x)[1] - 1)
}

这适用于单个字符串(示例中的 -0.57)时效果很好。在数据框中,我发现 lapply 根据“值”列中任何单元格的输入给出了正确的值。该代码似乎有点重复,但有效。

标签: r

解决方案


我们可以用map

library(tidyverse)
df[c('a', 'b', 'c', d')] <- map(list(f_a, f_b, f_c, f_d), ~  lapply(df$value, .x)) 

注意:没有功能或示例,不清楚这是否是最佳解决方案。此外,正如评论中所指出的,许多功能可以直接应用于列,而不是循环遍历每个元素。


推荐阅读