当某些键有多个值时使用 tidyr::pivot_wider
Using tidyr::pivot_wider when some keys have multiple values
我有一个很长的数据框,我想加宽,但是一个键有两个不同的值:
df <- data.frame(ColA=c("A", "B", "B", "C"), ColB=letters[23:26])
ColA ColB
1 A w
2 B x
3 B y
4 C z
我希望我的输出是此键的两个值的粘贴:
ColA ColB
1 A w
2 B xy
3 C z
常规 pivot_wider()
将发出警告并将值转换为列表:
df.wide <- df %>%
pivot_wider(names_from=ColA, values_from=ColB)
Warning message:
Values are not uniquely identified; output will contain list-cols.
* Use `values_fn = list` to suppress this warning.
* Use `values_fn = length` to identify where the duplicates arise
* Use `values_fn = {summary_fun}` to summarise duplicates
# A tibble: 1 x 3
A B C
<list> <list> <list>
1 <chr [1]> <chr [2]> <chr [1]>
根据警告,带有 value_fn()
的 pivot_wider()
与我想要的中间步骤类似:
# intermediate step
df.wide <- df %>%
pivot_wider(names_from=ColA, values_from=ColB, values_fn=SOMETHING)
A B C
1 w xy z
但看起来 values_fn()
只接受汇总函数,而不是对字符数据起作用的函数(比如 paste()
)
我能得到的最接近的是:
df %>%
pivot_wider(names_from=ColA, values_from=ColB, values_fn=list) %>%
mutate(across(everything(), as.character)) %>%
pivot_longer(cols=everything(), names_to="ColA", values_to="ColB")
# A tibble: 3 x 2
ColA ColB
<chr> <chr>
1 A "w"
2 B "c(\"x\", \"y\")"
3 C "z"
具有额外的变异 gsub()
类型的功能。当然有更简单的方法!最好在tidyverse
内,也可以对其他包开放。
谢谢
我认为您不需要在这里转换,除非您的真实数据比显示的示例更复杂。
library(dplyr)
df %>%
group_by(ColA) %>%
summarise(ColB = paste0(ColB, collapse = ""))
结果:
# A tibble: 3 × 2
ColA ColB
<chr> <chr>
1 A w
2 B xy
3 C z
我有一个很长的数据框,我想加宽,但是一个键有两个不同的值:
df <- data.frame(ColA=c("A", "B", "B", "C"), ColB=letters[23:26])
ColA ColB
1 A w
2 B x
3 B y
4 C z
我希望我的输出是此键的两个值的粘贴:
ColA ColB
1 A w
2 B xy
3 C z
常规 pivot_wider()
将发出警告并将值转换为列表:
df.wide <- df %>%
pivot_wider(names_from=ColA, values_from=ColB)
Warning message:
Values are not uniquely identified; output will contain list-cols.
* Use `values_fn = list` to suppress this warning.
* Use `values_fn = length` to identify where the duplicates arise
* Use `values_fn = {summary_fun}` to summarise duplicates
# A tibble: 1 x 3
A B C
<list> <list> <list>
1 <chr [1]> <chr [2]> <chr [1]>
根据警告,带有 value_fn()
的 pivot_wider()
与我想要的中间步骤类似:
# intermediate step
df.wide <- df %>%
pivot_wider(names_from=ColA, values_from=ColB, values_fn=SOMETHING)
A B C
1 w xy z
但看起来 values_fn()
只接受汇总函数,而不是对字符数据起作用的函数(比如 paste()
)
我能得到的最接近的是:
df %>%
pivot_wider(names_from=ColA, values_from=ColB, values_fn=list) %>%
mutate(across(everything(), as.character)) %>%
pivot_longer(cols=everything(), names_to="ColA", values_to="ColB")
# A tibble: 3 x 2
ColA ColB
<chr> <chr>
1 A "w"
2 B "c(\"x\", \"y\")"
3 C "z"
具有额外的变异 gsub()
类型的功能。当然有更简单的方法!最好在tidyverse
内,也可以对其他包开放。
谢谢
我认为您不需要在这里转换,除非您的真实数据比显示的示例更复杂。
library(dplyr)
df %>%
group_by(ColA) %>%
summarise(ColB = paste0(ColB, collapse = ""))
结果:
# A tibble: 3 × 2
ColA ColB
<chr> <chr>
1 A w
2 B xy
3 C z