在列表列中更改时出现警告消息 "argument is not an atomic vector; coercing"
warning message "argument is not an atomic vector; coercing" when mutating in a list column
我在我的数据中做了一些重塑。我基本上在做两件事:
- 具有相同值的所有
x
个案例应 nested/summarized 到列表列中。
- 对于剩余的
x
值,我将在 y
中使用一个或多个逗号分隔的字符值。我想将这些字符值拆分为单独的值,然后将其作为字符向量放入现有的 y
列表列中。所以例如对于 x == “second”,我确实有字符向量“C,D”(所以只有一个值),我想创建一个字符向量 c(“C”,“D”),即长度为 2.
下面的代码似乎可以满足我的要求,但我收到一条警告消息。虽然这只是一条警告消息,但我想确保我做的是正确的。
library(tidyverse)
df <- data.frame(x = c("first", "first", "second", "third"),
y = c("A", "B", "C, D", "E, F, G"))
df
x y
1 first A
2 first B
3 second C, D
4 third E, F, G
.
df |>
group_by(x) |>
summarise(y = list(y)) |>
rowwise() |>
mutate(y = list(as.vector(y, mode = "character"))) |>
ungroup() |>
mutate(across(y, ~if_else(!str_detect(x, "first"), str_split(., ", "), y)))
哪个(正确地)给出:
# A tibble: 3 x 2
x y
<chr> <list>
1 first <chr [2]>
2 second <chr [2]>
3 third <chr [2]>
但有一个警告:
Warning message:
Problem with `mutate()` input `..1`.
i `..1 = across(...)`.
i argument is not an atomic vector; coercing
我知道吗can/should?
您可以使用 tidyr::separate_rows
更轻松地获得此结果:
df |>
separate_rows(y) |>
group_by(x) |>
summarise(y = list(y))
# x y
# <chr> <list>
# 1 first <chr [2]>
# 2 second <chr [2]>
# 3 third <chr [3]>
我在我的数据中做了一些重塑。我基本上在做两件事:
- 具有相同值的所有
x
个案例应 nested/summarized 到列表列中。 - 对于剩余的
x
值,我将在y
中使用一个或多个逗号分隔的字符值。我想将这些字符值拆分为单独的值,然后将其作为字符向量放入现有的y
列表列中。所以例如对于 x == “second”,我确实有字符向量“C,D”(所以只有一个值),我想创建一个字符向量 c(“C”,“D”),即长度为 2.
下面的代码似乎可以满足我的要求,但我收到一条警告消息。虽然这只是一条警告消息,但我想确保我做的是正确的。
library(tidyverse)
df <- data.frame(x = c("first", "first", "second", "third"),
y = c("A", "B", "C, D", "E, F, G"))
df
x y
1 first A
2 first B
3 second C, D
4 third E, F, G
.
df |>
group_by(x) |>
summarise(y = list(y)) |>
rowwise() |>
mutate(y = list(as.vector(y, mode = "character"))) |>
ungroup() |>
mutate(across(y, ~if_else(!str_detect(x, "first"), str_split(., ", "), y)))
哪个(正确地)给出:
# A tibble: 3 x 2
x y
<chr> <list>
1 first <chr [2]>
2 second <chr [2]>
3 third <chr [2]>
但有一个警告:
Warning message:
Problem with `mutate()` input `..1`.
i `..1 = across(...)`.
i argument is not an atomic vector; coercing
我知道吗can/should?
您可以使用 tidyr::separate_rows
更轻松地获得此结果:
df |>
separate_rows(y) |>
group_by(x) |>
summarise(y = list(y))
# x y
# <chr> <list>
# 1 first <chr [2]>
# 2 second <chr [2]>
# 3 third <chr [3]>