【问题标题】:Add column to df that's the output of a function that uses different column values combined to be a vector input将列添加到 df 这是一个函数的输出,该函数使用不同的列值组合为向量输入
【发布时间】:2019-07-31 16:09:54
【问题描述】:

这是我实际问题的一个非常简化的版本。

我的真实df 有很多列,我需要使用列名字符向量中的select 执行此操作。

library(tidyverse)


df <- data.frame(a1 = c(1:5), 
             b1 = c(3,1,3,4,6), 
             c1 = c(10:14), 
             a2 = c(9:13), 
             b2 = c(3:7), 
             c2 = c(15:19))
df
  a1 b1 c1 a2 b2 c2
1  1  3 10  9  3 15
2  2  1 11 10  4 16
3  3  3 12 11  5 17
4  4  4 13 12  6 18
5  5  6 14 13  7 19

假设我想使用mutate 为选定列的每一行获取cor - 我试过了:

df %>% 
  mutate(my_cor = cor(x = c(a1,b1,c2), y = c(a2,b2,c2)))

但这不起作用,因为它为每个列标题输入使用完整的数据列。

上面输出dfmy_cor列的第一行应该是计算:

cor(x = c(1,3,10), y = c(9,3,15))

下一行应该是:

cor(x = c(2,1,11), y = c(10,4,16))

等等。我使用的实际函数更复杂,但它确实需要两个向量输入,比如cor,所以我认为这将是一个很好的代理。

我觉得我应该使用 purrr 来执行此操作 (similar to this post),但我还没有让它发挥作用。

Bonus:我面临的实际问题是使用一个会使用许多不同列的函数,所以我希望能够从像my_list_of_cols &lt;- c("a1", "b1", "c1") 这样的字符向量select 他们(我的真实清单要长得多)。

我怀疑我会像链接到的帖子一样使用pmap_dbl,但我无法让它工作 - 我尝试了类似...

mutate(my col = pmap_dbl(select(., var = my_list_of_cols), somefunction))

(请注意,上述部分中的 somefunction 接受 2 个向量输入,但其中一个是静态和预定义的 - 您可以假设向量 c(a2, b2, c2) 是静态和预定义的,例如:

somefunction <- function(a1,b1,c1){
    a2 = 1 
    b2 = 4
    c2 = 5
    my_vec = c(a2, b2, c2)
         cor(x = (a1,b1,c1), y = my_vec)
}

)

我仍在学习如何使用purrr,因此我们将不胜感激!

【问题讨论】:

  • 试试df %&gt;% mutate(my_cor = pmap_dbl(., ~ c(...) %&gt;% {cor(.[1:3], .[4:6])}))
  • pmap_dbl(., ~ c(...) %&gt;% {cor(.[1:3], .[4:6])}) 部分中的. 不是表示选择所有列吗?我的 true df 实际上并未使用所有列。同样在c(...) - 我需要将列名作为字符输入吗?
  • 在那。你可以用select(., my_list_of_cols) 换行。但是第二组列在哪里你也有'a2','b2','c2',就像'y'
  • 抱歉在这方面过于密集 - 我对 purr 还是新手 - select(., my_list_of_cols) 部分代替了 .c(...)
  • 在您的代码中,您只传递了'a1'、'b1'、'c1',而忽略了'a2'、'b2'等

标签: r purrr


【解决方案1】:

这是一种将列名对象和其他名称传递给select的选项

library(tidyverse)
my_list_of_cols <- c("a1", "b1", "c1")
another_list_cols <- c("a2", "b2", "c2")

df %>% 
  mutate(my_cor = pmap_dbl(
    select(., my_list_of_cols,
           another_list_cols), ~ c(...) %>% 
      {cor(.[my_list_of_cols], .[setdiff(names(.), my_list_of_cols)])}
    ))

【讨论】:

    猜你喜欢
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2018-09-29
    • 1970-01-01
    相关资源
    最近更新 更多