【问题标题】:How to pass a data in a pipe to colSums如何将管道中的数据传递给 colSums
【发布时间】:2021-06-27 14:29:07
【问题描述】:

我想使用%>% 通过colSums 传递数据。事实上,这应该适用于所有计算。

这是我的例子:

我可以使用以下代码来实现我的目标:

result<- colSums(!is.na(df[ , c("A", "B", "C","D", "RT", "PR", "OTH")]), na.rm = TRUE)

我怎样才能把我的代码改写成这样:

result <- df[ , c("A", "B", "C","D", "RT", "PR", "OTH")] %>%
colSums(!is.na(), na.rm = TRUE)

这些代码不起作用。我得到了错误代码Error in is.na() : 0 arguments passed to 'is.na' which requires 1。谁能给我一些指导?

谢谢

更新:

样本数据:

df<-structure(list(A = c("A", NA, NA, NA, NA, NA, NA, NA), B = c(NA, 
NA, "B", NA, NA, NA, NA, NA), C = c(NA, "C", NA, NA, NA, NA, 
NA, NA), D = c(NA, NA, NA, "D", "D", NA, NA, NA), RT = c(NA, 
"RT", NA, NA, NA, NA, "RT", NA), PR = c(NA, NA, "PR", NA, NA, 
NA, NA, NA), OTH = c(NA, NA, NA, NA, "OTH", NA, NA, "OTH")), row.names = c(NA, 
-8L), class = c("tbl_df", "tbl", "data.frame"))

【问题讨论】:

标签: r


【解决方案1】:

我已通过以下方式更新了我的代码。我不知道为什么当我否定is.na 时,我只是无法通过管道得到想要的结果

colSums(!is.na(df[ , c("A", "B", "C","D", "RT", "PR", "OTH")]))

  A   B   C   D  RT  PR OTH 
  1   1   1   2   2   1   2 

只有这样你才能计算那些不是NA的值。如果你想坚持base R。

【讨论】:

  • 请记住,当您将数据传递给另一个函数时,该函数的第一个参数应该是数据框或向量。
  • 感谢您的回答。我使用!is.na() 的原因是计算a,b,c ,d, etc 答案的案例数。它们是字符变量而不是数字。有什么办法可以保留!is.na()
  • 欢迎您。不在colSums 中,但您可以在结果向量中使用它。
  • 我刚刚用示例数据更新了帖子。谢谢。
  • 我更新了我的代码。这是is.na 的一种奇怪情况,我们可以使用管道,但如果我否定它,结果将不是你喜欢的。
【解决方案2】:

dplyr 样式将是

result <- df[ , c("A", "B", "C","D", "RT", "PR", "OTH")] %>% mutate(across(everything(), ~colSums(!is.na(.), na.rm = TRUE))) 

【讨论】:

  • 我收到错误代码`错误:mutate() 输入有问题..1。 x 'x' 必须是至少有两个维度的数组 i 输入 ..1across(everything(), ~colSums(!is.na(.), na.rm = TRUE))。`
【解决方案3】:

管道的作用是将管道前面的内容作为后面内容的第一个参数,所以

# What the pipe does
## with pipe
x %>% foo(other_arg)
## equivalent to this:
foo(x, other_arg)

## your version piped:
df[ , c("A", "B", "C","D", "RT", "PR", "OTH")] %>%
  colSums(!is.na(), na.rm = TRUE)

## is interpreted like this:
colSums(df[ , c("A", "B", "C","D", "RT", "PR", "OTH")], !is.na(), na.rm = TRUE)

希望以上内容是有意义的,您可以了解为什么会收到关于 is.na() 需要参数的错误。

您可以使用管道,但您注意到! 需要特殊处理。 ! 作为前缀比 %&gt;% 具有更高的优先级,因此 R 将尝试评估 ! 结果 before 管道进入它。要解决这个问题,我们可以将! 显式调用为函数,而不是前缀运算符。或者,如果您加载magrittr 包(%&gt;% 的原始来源),它会为此类情况提供别名,包括not() 函数,它是! 的别名。如下所示:

df[ , c("A", "B", "C","D", "RT", "PR", "OTH")] %>%
  is.na() %>%
  `!`() %>%
  colSums(na.rm = TRUE)

library(magrittr)
df[ , c("A", "B", "C","D", "RT", "PR", "OTH")] %>%
  is.na() %>%
  not() %>%
  colSums(na.rm = TRUE)

【讨论】:

  • 最后一个有效。我认为colSums(!is.na(.), na.rm = TRUE) 应该可以工作。但它没有。
  • 嗯,你是对的。我将不得不调查更多......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 2014-08-26
  • 2016-07-03
  • 1970-01-01
  • 2021-11-22
  • 2022-10-25
相关资源
最近更新 更多