【问题标题】:Please help me understand why mutate does this请帮助我理解为什么 mutate 会这样做
【发布时间】:2020-04-20 19:15:44
【问题描述】:

我有一个包含 40 个 obs x 3 个变量的数据框“dat2”。我想添加一列“tx”,基于 2 个向量:“治疗”(5 个元素)和“ET”(4 个元素)。

treatments <- c("ctrl", "204", "226", "204+226", "blina")
ET <- c("10:1", "5:1", "2.5:1", "T only")

如果我像这样组合向量:

rep(rep(treatments, each=2), length(ET))

根据需要,我得到一个长度 = 40 的向量。

> rep(rep(treatments, each=2), length(ET))
 [1] "ctrl"    "ctrl"    "204"     "204"     "226"     "226"     "204+226"
 [8] "204+226" "blina"   "blina"   "ctrl"    "ctrl"    "204"     "204"    
[15] "226"     "226"     "204+226" "204+226" "blina"   "blina"   "ctrl"   
[22] "ctrl"    "204"     "204"     "226"     "226"     "204+226" "204+226"
[29] "blina"   "blina"   "ctrl"    "ctrl"    "204"     "204"     "226"    
[36] "226"     "204+226" "204+226" "blina"   "blina"  

但是,如果我在 mutate 中使用同一行:

mutate(dat2, tx = rep(rep(treatments, each=2), length(ET)))

它不起作用,因为它似乎生成了 400 个元素:

Error: Column `tx` must be length 40 (the number of rows) or one, not 400

我知道我可以通过使用 reps 创建一个向量然后使用该向量在 mutate 中定义“tx”来解决问题,但我想了解为什么“rep”在 mutate 中的行为不同。

谢谢!!

【问题讨论】:

  • 更严格的行为是一个有意的特性——tidyverse 的开发人员希望避免“为了方便”而做出无形假设的情况,例如重复一个向量以适应数据框,这会产生以下行为:可能不明显。有道理,但有时肯定会给编码人员带来额外的工作

标签: r dplyr rep


【解决方案1】:

问题在于mutate 期望输出的长度与行数相同。如果不是这样,它将引发错误。我们可以将其包装在 list 中,然后 unnest 以展开 list

library(dplyr)
library(tidyr)
dat2 %>%
    summarise(tx = list(rep(rep(treatments, each=2), length(ET))))  %>%
    unnest(c(tx))

【讨论】:

  • 谢谢。但是rep(rep(treatments, each=2), length(ET))的输出是40,为什么会变成400?
  • @user10577351 如果您需要单个实例,请使用 summarise。抱歉,忘记更改您的mutate
  • @user10577351 我更正了,你能检查一下吗
猜你喜欢
  • 1970-01-01
  • 2016-02-18
  • 2022-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多