【问题标题】:Short syntax simplification with mutate and lapply使用 mutate 和 lapply 简化语法
【发布时间】:2019-08-25 15:16:11
【问题描述】:

我有创建新数据框 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 问题here
  • 你是lapplying 到一栏。不是问题的答案,但很可能与f_a(df[, "value"])等相同。至于问题,可能是?mutate_at
  • 感谢您的建议,这些确实使代码更短。在使用 lapply 之前,我在使用函数创建列时遇到了麻烦。当应用于一个输入值时,它们可以完美地工作,但在所有行中它给出了错误的值。我推断 lapply 将函数分别应用于“值”列中的每个单元格。当我删除 lapply 时,虽然代码更短,但 R 正在做一些我不理解的事情。

标签: r


【解决方案1】:

我们可以使用map

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

注意:没有函数或示例,不清楚这是否是最佳解决方案。此外,如 cmets 中所述,许多函数可以直接应用于列,而不是循环遍历每个元素。

【讨论】:

  • 谢谢,这非常简洁,输出看起来仍然如预期的那样
猜你喜欢
  • 2018-12-15
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
相关资源
最近更新 更多