[英]Why do I get “number of items to replace is not a multiple of replacement length”
[英]Using mutate, if_else and replace I get In x[list] <- values : number of items to replace is not a multiple of replacement length
我知道这个主题已经在 SO 中多次讨论过,但我找不到我的问题的答案。
我有以下数据(编辑,添加了完整的真实数据):
structure(list(Expo = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("DC", "DI"), class = "factor"),
day = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 5L, 5L, 5L, 5L, 5L, 5L,
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L,
5L, 5L, 5L, 5L, 5L, 5L, 5L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L,
7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L,
7L, 7L, 7L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L,
9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 10L,
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L,
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L,
10L, 10L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 5L, 5L, 5L, 5L, 5L, 5L, 5L,
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 7L, 7L, 7L,
7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L,
7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 9L, 9L, 9L, 9L, 9L, 9L,
9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L), SYN = c("S", "U", "N",
"S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N",
"S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N",
"S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N",
"S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N",
"S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N",
"S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N",
"S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N",
"S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N",
"S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N",
"S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N",
"S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N",
"S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N",
"S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N",
"S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N",
"S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N",
"S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N",
"S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N",
"S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N",
"S", "U", "N", "S", "U"), freq.n = c(19L, 6L, 1L, 4L, 2L,
3L, 2L, 1L, 12L, 10L, 1L, 1L, 1L, 1L, 24L, 4L, 1L, 1L, 3L,
1L, 1L, 8L, 49L, 9L, 2L, 3L, 6L, 3L, 2L, 1L, 12L, 7L, 2L,
1L, 2L, 1L, 1L, 2L, 1L, 2L, 38L, 3L, 3L, 1L, 3L, 1L, 1L,
2L, 4L, 2L, 105L, 7L, 4L, 3L, 1L, 1L, 2L, 5L, 11L, 21L, 2L,
1L, 2L, 1L, 1L, 2L, 3L, 67L, 5L, 2L, 6L, 4L, 1L, 1L, 9L,
4L, 97L, 19L, 10L, 3L, 6L, 1L, 2L, 2L, 12L, 12L, 2L, 1L,
1L, 2L, 2L, 4L, 95L, 14L, 8L, 2L, 2L, 1L, 1L, 4L, 5L, 153L,
56L, 13L, 10L, 2L, 4L, 3L, 5L, 4L, 12L, 12L, 1L, 2L, 1L,
2L, 1L, 2L, 82L, 33L, 10L, 6L, 3L, 2L, 2L, 2L, 4L, 6L, 82L,
3L, 2L, 1L, 3L, 1L, 2L, 3L, 20L, 5L, 3L, 30L, 7L, 5L, 3L,
2L, 1L, 2L, 1L, 66L, 10L, 4L, 1L, 1L, 1L, 2L, 23L, 1L, 3L,
5L, 3L, 53L, 11L, 3L, 1L, 108L, 18L, 10L, 3L, 1L, 1L, 2L,
3L, 14L, 1L, 1L, 2L, 2L, 3L, 2L, 101L, 14L, 4L, 1L, 122L,
33L, 9L, 1L, 1L, 2L, 3L, 2L, 3L, 9L, 10L, 2L, 1L, 2L, 1L,
1L, 1L, 65L, 20L, 2L, 5L, 2L, 1L, 3L, 2L, 1L, 3L, 11L, 3L,
3L, 1L, 1L, 4L, 2L, 1L, 1L, 1L, 6L, 2L, 2L, 1L, 1L)), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -224L))
我运行了以下代码:
library(dplyr)
q = c("3" = "1",
"5" = "3",
"7" = "5",
"9" = "7",
"10" = "8")
Pi %>%
mutate(day = if_else(Expo == "DC",
replace(day, day == day, q), as.character(day)))
我在 x[list] <- values: number of items to replace is not a multiple of replacement length 中收到此警告,结果如下。
问题编辑后:我得到的一个子集示例。
# A tibble: 6 x 6
Expo day SYN freq.n
<fct> <chr> <chr> <int>
1 DC 1 S 19
2 DC 3 U 6
3 DC 5 N 1
4 DC 7 S 4
5 DC 8 U 2
6 DC 1 N 3
它显然在“天”中分配了不正确的值。
预期的 output 应该是:
# A tibble: 6 x 6
Expo day SYN freq.n
<fct> <chr> <chr> <int>
1 DC 1 S 19
2 DC 1 U 6
3 DC 1 N 1
4 DC 1 S 4
5 DC 1 U 2
6 DC 1 N 3
问题是相同的代码行与类似的 tbl 完美运行。
我将不胜感激一些可以为我指明正确方向的评论。
提前谢谢了。
使用dplyr::case_when
...这是否符合您的要求?
case_when 允许将多个条件应用于向量,在这种情况下,只有一个条件,因此 case_when 用作 if else 条件:
条件由Expo == "DC"
定义,当它为 TRUE 时,公式波浪号“~”指示要做什么,即从命名向量中替换day
的值。 case_when 的第二部分,即TRUE ~ as.character(day)
向量的未解析元素,它可以被视为 if else 条件的“else”部分,即它处理所有情况(直观地反) 条件的结果为 FALSE。 另一种看待它的方法是说所有不受前面 case_when 影响的元素都是 TRUE 并且 ~ 让 R 知道如何处理它们。
library(dplyr)
library(stringr)
df %>%
mutate(day = case_when(Expo == "DC" ~ str_replace_all(day, q),
TRUE ~ as.character(day))) %>%
head(20)
#> # A tibble: 20 x 4
#> Expo day SYN freq.n
#> <fct> <chr> <chr> <int>
#> 1 DC 1 S 19
#> 2 DC 1 U 6
#> 3 DC 1 N 1
#> 4 DC 1 S 4
#> 5 DC 1 U 2
#> 6 DC 1 N 3
#> 7 DC 1 S 2
#> 8 DC 1 U 1
#> 9 DC 1 N 12
#> 10 DC 1 S 10
#> 11 DC 1 U 1
#> 12 DC 1 N 1
#> 13 DC 1 S 1
#> 14 DC 1 U 1
#> 15 DC 1 N 24
#> 16 DC 1 S 4
#> 17 DC 1 U 1
#> 18 DC 1 N 1
#> 19 DC 1 S 3
#> 20 DC 1 U 1
由代表 package (v0.3.0) 于 2020 年 7 月 10 日创建
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.