【问题标题】:How to correctly use pipe operator from dplyr如何正确使用 dplyr 中的管道运算符
【发布时间】:2021-08-29 23:12:06
【问题描述】:

我正在尝试以下代码行:

library(dplyr)
library(zoo)
data.frame('col1' = c('C', 'A', 'B', 'A'), 'col2' = c(1,2,3,4)) %>%
    apply(as.matrix(.),
            1,
            function(ii) {
                merge(data.frame('xx' = sample(letters[1:10], 5, replace = T), 'val1' = 1:5),
                        data.frame('xx' = sample(letters[1:5], 5, replace = T), 'val2' = 21:25),
                        by = 'xx', all = T) %>%
                mutate('Info' = ii['col1']) %>%
                `colnames<-`(c('yy0', 'yy1', 'yy2', 'yy3'))

            })

使用此代码,我得到以下错误

Error in match.fun(FUN) : '1' is not a function, character or symbol

如果我使用正常计算而不使用pipe 运算符,上述流程如何完美运行。

您能帮我在上述设置的应用功能中如何访问父 dataframe 对象的信息吗?

例如,我想在 apply 中使用以下代码:

而不是

mutate('Info' = ii['col1'])

我想用

mutate('Info' = <<min of the column 'col2' in parent dataframe>>)

任何指针都将受到高度赞赏

【问题讨论】:

  • 当你说。 min 列 'col2',但您正在循环遍历行?

标签: r dplyr pipe


【解决方案1】:

只需将apply 部分包裹在{} 中即可阻止代码

data.frame('col1' = c('C', 'A', 'B', 'A'), 'col2' = c(1,2,3,4)) %>% {
    apply(as.matrix(.),
            1,
            function(ii) {
                merge(data.frame('xx' = sample(letters[1:10], 5, replace = T), 'val1' = 1:5),
                        data.frame('xx' = sample(letters[1:5], 5, replace = T), 'val2' = 21:25),
                        by = 'xx', all = T) %>%
                mutate('Info' = ii['col1']) %>%
                `colnames<-`(c('yy0', 'yy1', 'yy2', 'yy3'))

            })}

-输出

[[1]]
  yy0 yy1 yy2 yy3
1   a   1  22   C
2   b   5  NA   C
3   c  NA  25   C
4   e  NA  21   C
5   e  NA  23   C
6   e  NA  24   C
7   h   4  NA   C
8   j   2  NA   C
9   j   3  NA   C

[[2]]
   yy0 yy1 yy2 yy3
1    a   1  22   A
2    a   1  23   A
3    a   2  22   A
4    a   2  23   A
5    b  NA  21   A
6    b  NA  25   A
7    c   5  NA   A
8    d  NA  24   A
9    e   4  NA   A
10   j   3  NA   A

[[3]]
  yy0 yy1 yy2 yy3
1   a  NA  25   B
2   b  NA  24   B
3   c  NA  22   B
4   d   4  23   B
5   d   5  23   B
6   e  NA  21   B
7   g   2  NA   B
8   h   1  NA   B
9   h   3  NA   B

[[4]]
  yy0 yy1 yy2 yy3
1   a   4  22   A
2   a   4  23   A
3   b  NA  25   A
4   d  NA  21   A
5   e   3  24   A
6   f   1  NA   A
7   h   5  NA   A
8   j   2  NA   A

如果我们想要父数据集,创建一个对象

data.frame('col1' = c('C', 'A', 'B', 'A'), 'col2' = c(1,2,3,4)) %>% {  tmp <- .
    apply(as.matrix(.),
            1,
            function(ii) {
                merge(data.frame('xx' = sample(letters[1:10], 5, replace = T), 'val1' = 1:5),
                        data.frame('xx' = sample(letters[1:5], 5, replace = T), 'val2' = 21:25),
                        by = 'xx', all = T) %>%
                mutate('Info' =tmp[['col1']][which.min(tmp[['col2']])]) %>%
                `colnames<-`(c('yy0', 'yy1', 'yy2', 'yy3'))

            })}

-输出

[[1]]
  yy0 yy1 yy2 yy3
1   a  NA  21   C
2   a  NA  22   C
3   b   5  23   C
4   b   5  24   C
5   c   4  NA   C
6   d   1  25   C
7   f   3  NA   C
8   g   2  NA   C

[[2]]
  yy0 yy1 yy2 yy3
1   a   4  22   C
2   a   4  24   C
3   c   2  21   C
4   d  NA  23   C
5   e  NA  25   C
6   g   3  NA   C
7   h   5  NA   C
8   i   1  NA   C

[[3]]
   yy0 yy1 yy2 yy3
1    a   2  22   C
2    c   3  21   C
3    c   3  24   C
4    c   3  25   C
5    c   4  21   C
6    c   4  24   C
7    c   4  25   C
8    e  NA  23   C
9    i   5  NA   C
10   j   1  NA   C

[[4]]
  yy0 yy1 yy2 yy3
1   a   1  NA   C
2   b  NA  24   C
3   c   3  23   C
4   c   3  25   C
5   d   5  NA   C
6   e  NA  21   C
7   e  NA  22   C
8   h   2  NA   C
9   h   4  NA   C

【讨论】:

  • 谢谢。您是否也可以帮助找到我的第二个问题的解决方案mutate('Info' = &lt;&lt;min of the column 'col2' in parent dataframe&gt;&gt;)
  • @BrianSmith 但是,您的逻辑似乎是循环使用 apply MARGIN = 1 的行而不是列,即在当前代码中,每个“col2”只有一个值行。
  • @BrianSmith 您是否希望所有列表元素中的“yy3”始终为“C”?
  • 谢谢。这个关于min 的问题应该被认为是通用的。我只举了一个例子。我的基本问题是,如果我想在 apply 函数中使用我父母 dataframe 的一些信息,我该怎么做?
  • @BrianSmith 你可以在 {} 中创建一个对象,就像在更新中一样
猜你喜欢
  • 2015-04-21
  • 2015-02-06
  • 2018-04-09
  • 2016-11-21
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多