【问题标题】:Arguments must have same length when using tapply使用 tapply 时参数必须具有相同的长度
【发布时间】:2019-12-19 19:25:47
【问题描述】:
data.frame(q1 = sample(c(1, 5), 200, replace = T, prob = c(1/2, 1/2)), 
           gender = sample(c("M", "F"), 200, replace = T, prob = c(2/3, 1/3)) 
           ) %>% tapply(.$q1,list(.$gender),FUN=sum)

我只想通过gender 使用tapplysum,但出现如下错误:

tapply(., .$q1, list(.$gender), FUN = sum) 中的错误: 参数必须具有相同的长度

问题出在哪里?

【问题讨论】:

  • tapply(df$q1, df$gender, sum) 工作或者如果你想将它与管道一起使用,你可能需要做df %>% {tapply(.$q1,list(.$gender),FUN=sum)}
  • @RonakShah,这个{}有什么用?
  • 默认情况下,管道的 LHS 是 RHS 上函数的第一个参数,因此通过使用 {} 我们可以避免这种行为。

标签: r dplyr


【解决方案1】:

对于 sum 示例,您可以使用data.table 语法:

library(data.table)
df <- data.frame(q1 = sample(c(1, 5), 200, replace = T, prob = c(1/2, 1/2)), 
                 gender = sample(c("M", "F"), 200, replace = T, prob = c(2/3, 1/3)))
as.data.table(df)[, sum(q1), by = gender]

这也适用于具有多个返回值的函数,这与我之前使用 summarize 的示例不同:

as.data.table(df)[, shapiro.test(q1), by = gender]

【讨论】:

  • 如果函数不是sum,而是像shapiro.test这样的函数,summarize(shapiro.test(q1))是否可行?
  • 哦,我明白了。不,总结单个返回值的工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 2019-03-01
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 2021-07-12
  • 2017-06-22
相关资源
最近更新 更多