【发布时间】: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)))
但这不起作用,因为它为每个列标题输入使用完整的数据列。
上面输出df的my_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 <- 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 %>% mutate(my_cor = pmap_dbl(., ~ c(...) %>% {cor(.[1:3], .[4:6])})) -
pmap_dbl(., ~ c(...) %>% {cor(.[1:3], .[4:6])})部分中的.不是表示选择所有列吗?我的 truedf实际上并未使用所有列。同样在c(...)- 我需要将列名作为字符输入吗? -
在那。你可以用
select(., my_list_of_cols)换行。但是第二组列在哪里你也有'a2','b2','c2',就像'y' -
抱歉在这方面过于密集 - 我对
purr还是新手 -select(., my_list_of_cols)部分代替了.或c(...)? -
在您的代码中,您只传递了'a1'、'b1'、'c1',而忽略了'a2'、'b2'等