【问题标题】:Why r shows an error when using dplyr and ifelse together?为什么 dplyr 和 ifelse 一起使用时 r 会显示错误?
【发布时间】:2020-01-10 15:29:15
【问题描述】:

我正在尝试在 R 分组中使用“ifelse”函数,但它不起作用。 我的数据是这样的:

Breed Animal
NOR    1  
NOR    1
SWE    1
HOL    2
NOR    2
NOR    3
NOR    3

所以我想创建一个新变量,称为“comp”,用于组合,如果动物的品种始终为 NOR,则为纯种,否则为混合。 data.frame 被称为 NOR,我使用的代码是:

NOR %>%
group_by (animal) %>%%
mutate(comp= ifelse(NOR$breed == "NOR", "purebred","admixed")

但是我有这个错误:错误:列“comp”必须是长度 28(组大小)或 1,而不是 1104。

我需要的输出是:

Breed Animal comp  
NOR     1     admixed
NOR     1     admixed
SWE     1     admixed
HOL     2     admixed
NOR     2     admixed
NOR     3     purebred
NOR     3     pubebred

提前感谢您! :)

【问题讨论】:

  • 删除NOR$。使用NOR$breed 会为您提供完整的列,但您正尝试按组执行操作,因此您需要该组的列子集,dplyr 仅使用breed 自动提供。 (这就是为什么错误告诉你你的向量大于组大小)
  • 除了@IceCreamToucan 所说的之外,每当您使用%>% 链接某些内容时,如果您只是引用其中的一列,则以后不必使用该数据框名称
  • 你还有一个错字:%>%%应该是%>%

标签: r if-statement dplyr


【解决方案1】:

示例数据。

df <- tibble(
   "Breed" = c(rep("NOR", 2), "SWE", "HOL", rep("NOR", 3)),
   "Animal" = c(rep(1, 3), rep(2, 2), rep(3, 2))
)

> df
# A tibble: 7 x 2
  Breed Animal
  <chr>  <dbl>
1 NOR        1
2 NOR        1
3 SWE        1
4 HOL        2
5 NOR        2
6 NOR        3
7 NOR        3

您想要的不是“NOR$breed”,而是“Breed”。您还想将条件包装在“全部”中。

df %>%
   group_by(Animal) %>%
   mutate(comp = ifelse(all(Breed == "NOR"), "purebred", "admixed"))

# A tibble: 7 x 3
# Groups:   Animal [3]
  Breed Animal comp    
  <chr>  <dbl> <chr>   
1 NOR        1 admixed 
2 NOR        1 admixed 
3 SWE        1 admixed 
4 HOL        2 admixed 
5 NOR        2 admixed 
6 NOR        3 purebred
7 NOR        3 purebred

【讨论】:

  • 是的,但实际上,它给出的结果并不是我所需要的。因为我不确定它是否分组良好,因为对于同一种动物,comp 中的所有行都应该相等。例如,动物 1 和 2 应该在它们的所有行中混合......
  • 已编辑答案。您需要做的就是将条件包含在“all”中。
【解决方案2】:

在这种情况下,我们可以使用if/else,因为输入是单个 TRUE/FALSE 值

library(dplyr)
df %>%
     group_by(Animal) %>% 
     mutate(comp = if(all(Breed == "NOR")) "purebred" else "admixed")
# A tibble: 7 x 3
# Groups:   Animal [3]
#  Breed Animal comp    
#  <chr>  <dbl> <chr>   
#1 NOR        1 admixed 
#2 NOR        1 admixed 
#3 SWE        1 admixed 
#4 HOL        2 admixed 
#5 NOR        2 admixed 
#6 NOR        3 purebred
#7 NOR        3 purebred

数据

df <- structure(list(Breed = c("NOR", "NOR", "SWE", "HOL", "NOR", "NOR", 
"NOR"), Animal = c(1, 1, 1, 2, 2, 3, 3)), row.names = c(NA, -7L
), class = c("tbl_df", "tbl", "data.frame"))

【讨论】:

  • 这是真的!感谢您的评论!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 2019-01-05
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
相关资源
最近更新 更多