r - 在函数内的 dplyr 中的列中存储和调用变量

标签 r dplyr rlang nse

我想在 tibble 的列单元格中存储一些变量。然后我想调用该列并粘贴这些变量的名称或调用该列并将这些变量对应的列粘贴在一起。此外,所有这些都发生在一个函数中,这是唯一剩下的硬编码,所以我真的很想找到解决这个问题的方法。

library("tidyverse") 
myData<-tibble("c1"=c("a","b","c"),
"c2"=c("1","2","3"),
"c3"=c("A","B","C"),
factors=c(list(c("c1","c2")),list(c("c2","c3")),list(c("c1","c2","c3"))))

myData%>%mutate(factors1=interaction(!!!quos(factors),sep=":",lex.order=TRUE))
# A tibble: 3 x 5
  c1    c2    c3    factors   factors1
  <chr> <chr> <chr> <list>    <fct>   
1 a     1     A     <chr [2]> c1:c2:c1
2 b     2     B     <chr [2]> c2:c3:c2
3 c     3     C     <chr [3]> c1:c2:c3

所以这允许我连接变量的名称,但如您所见,如果一个列表比其他列表长,它就会循环。

对于第二个问题,我想使用 $factors 列来专门调用其他列的值,我可以像这样硬编码:

myData%>%
mutate(factors2=interaction(!!!syms(c("c1","c2")),sep=":",lex.order=TRUE))
# A tibble: 3 x 5
 c1    c2    c3    factors   factors2
 <chr> <chr> <chr> <list>    <fct>   
1 a     1     A     <chr [2]> a:1     
2 b     2     B     <chr [2]> b:2     
3 c     3     C     <chr [3]> c:3  

但是,如果我尝试这样做:

myData%>%
mutate(factors2=interaction(!!!syms(factors),sep=":",lex.order=TRUE))

Error in lapply(.x, .f, ...) : object 'factors' not found

如果我尝试取消列出因素或使用其他 rlang 表达式,也会发生同样的情况。我也试过嵌套 rlang 表达式,但到目前为止还没有找到一个能按我的预期工作的表达式。

我觉得这应该是可能的,但到目前为止,我还没有发现关于堆栈溢出的问题,也没有找到表明它是这样的教程,所以也许我正在徒劳地追逐。感谢大家的宝贵时间和帮助。

我的完整代码:

library("tidyverse") 

myData<-tibble("c1"=c("a","b","c"),
"c2"=c("1","2","3"),
"c3"=c("A","B","C"),
factors=c(list(c("c1","c2")),list(c("c2","c3")),list(c("c1","c2","c3"))))%>%
mutate(factors1=interaction(!!!quos(factors),sep=":",lex.order=TRUE))%>%
mutate(factors2=interaction(!!!syms(factors),sep=":",lex.order=TRUE))

我想要的输出是:

    # A tibble: 3 x 6
 c1    c2    c3    factors   factors1   factors2
 <chr> <chr> <chr> <list>     <fct>      <fct>   
1 a     1     A     <chr [2]> c1:c2       a:1     
2 b     2     B     <chr [2]> c2:c3       2:B     
3 c     3     C     <chr [3]> c1:c2:c3    c:3:C  

最佳答案

下面是一个使用mapimap的方法:

library(tidyverse)

myData %>%
  mutate(factor1 = factors %>% map(~interaction(as.list(.), sep=':', lex.order = TRUE)) %>% unlist(),
         factor2 = factors %>% imap(~interaction(myData[.y, match(.x, names(myData))], sep=":", lex.order = TRUE)) %>% unlist())

对于 factor1,我没有将参数拼接成点,而是将列表传递给 interaction

对于 factor2,我将每行中的 factorsmyData 中的 names 进行匹配,并使用列索引(match(.x, names(myData))) 结合行索引 (.y from imap) 对适当的元素进行子集化用于交互

factor1factor2 都需要一个 unlist 因为 mapimap 返回列表。

输出:

# A tibble: 3 x 6
  c1    c2    c3    factors   factor1  factor2
  <chr> <chr> <chr> <list>    <fct>    <fct>  
1 a     1     A     <chr [2]> c1:c2    a:1    
2 b     2     B     <chr [2]> c2:c3    2:B    
3 c     3     C     <chr [3]> c1:c2:c3 c:3:C  

关于r - 在函数内的 dplyr 中的列中存储和调用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54417946/

相关文章:

R:列表中的快速哈希搜索(环境)

r - 是否有一些函数可以使用 group_by 在 R dplyr 中保留唯一值?

r - 当 curlycurly 不起作用时如何将数据框列作为参数传递? (例如嵌套内的 map 功能)

r - 在 dplyr tidyverse 中按组对不同行数进行采样

r - 使用 data.table 进行准报价

r - 使用 Shiny 选择列、相等、值来按条件过滤

r - 从嵌套列表中提取元素到 data.matrix

r - 将列名转换为 R 中数据框的第一行

R,从向量中查找字符串,创建新的 TRUE/FALSE 列

r - 使用 dplyr 和 lazyeval 进行编程