gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:55:46 27 4
gpt4 key购买 nike

我想在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com