延长具有重复名称的数据框
Lengthen data frame with duplicate names
我有一个 data.frame
,其中包含我想要加长的重复列名。我不想修改名称,因为它们对应于我未来专栏中的值。我正在尝试使用 pivot_longer
但它会引发错误。
Error: Can't transform a data frame with duplicate names.
我查看了该函数的文档并使用“names_repair”参数来解决这个问题,但它没有帮助。
我还在 tidyvere 的 github 上发现了 this 问题,但我不确定那里发生了什么。
这是我的代码:
library(dplyr)
library(tidyr)
df %>%
mutate_all(as.character) %>%
pivot_longer(-a, names_to = "Names", values_to = "Values", names_repair = "minimal")
有办法吗?
期望的输出:
a Names Values
<chr> <chr> <chr>
1 1 b 4
2 1 c a
3 1 c d
4 2 b 5
5 2 c b
6 2 c e
7 3 b 6
8 3 c c
9 3 c f
示例数据:
df <- setNames(data.frame(c(1,2,3),
c(4,5,6),
c("a","b","c"),
c("d","e","f"),
stringsAsFactors = F),
c("a","b","c","c"))
问题不在于 pivot_wider
,它可以用于包含同名列的 data.frame
- mutate
不能。因此,我们需要通过(i)使用基数 R 或(ii)如果您想留在更大的 tidyverse purrr::modify_at
中,将列转换为字符列(毕竟 data.frame
始终是 list
).之后它只是对 pivot_wider
.
的常规调用
df <- setNames(data.frame(c(1,2,3),
c(4,5,6),
c("a","b","c"),
c("d","e","f"),
stringsAsFactors = F),
c("a","b","c","c"))
library(dplyr)
library(tidyr)
# Alternatively use base R to transform cols to character
# df[,c("a", "b")] <- lapply(df[,c("a", "b")], as.character)
df %>%
purrr::modify_at(c("a","b"), as.character) %>%
pivot_longer(-a,
names_to = "Names",
values_to = "Values")
#> # A tibble: 9 x 3
#> a Names Values
#> <chr> <chr> <chr>
#> 1 1 b 4
#> 2 1 c a
#> 3 1 c d
#> 4 2 b 5
#> 5 2 c b
#> 6 2 c e
#> 7 3 b 6
#> 8 3 c c
#> 9 3 c f
由 reprex package (v0.3.0)
于 2021-02-23 创建
我有一个 data.frame
,其中包含我想要加长的重复列名。我不想修改名称,因为它们对应于我未来专栏中的值。我正在尝试使用 pivot_longer
但它会引发错误。
Error: Can't transform a data frame with duplicate names.
我查看了该函数的文档并使用“names_repair”参数来解决这个问题,但它没有帮助。
我还在 tidyvere 的 github 上发现了 this 问题,但我不确定那里发生了什么。
这是我的代码:
library(dplyr)
library(tidyr)
df %>%
mutate_all(as.character) %>%
pivot_longer(-a, names_to = "Names", values_to = "Values", names_repair = "minimal")
有办法吗?
期望的输出:
a Names Values
<chr> <chr> <chr>
1 1 b 4
2 1 c a
3 1 c d
4 2 b 5
5 2 c b
6 2 c e
7 3 b 6
8 3 c c
9 3 c f
示例数据:
df <- setNames(data.frame(c(1,2,3),
c(4,5,6),
c("a","b","c"),
c("d","e","f"),
stringsAsFactors = F),
c("a","b","c","c"))
问题不在于 pivot_wider
,它可以用于包含同名列的 data.frame
- mutate
不能。因此,我们需要通过(i)使用基数 R 或(ii)如果您想留在更大的 tidyverse purrr::modify_at
中,将列转换为字符列(毕竟 data.frame
始终是 list
).之后它只是对 pivot_wider
.
df <- setNames(data.frame(c(1,2,3),
c(4,5,6),
c("a","b","c"),
c("d","e","f"),
stringsAsFactors = F),
c("a","b","c","c"))
library(dplyr)
library(tidyr)
# Alternatively use base R to transform cols to character
# df[,c("a", "b")] <- lapply(df[,c("a", "b")], as.character)
df %>%
purrr::modify_at(c("a","b"), as.character) %>%
pivot_longer(-a,
names_to = "Names",
values_to = "Values")
#> # A tibble: 9 x 3
#> a Names Values
#> <chr> <chr> <chr>
#> 1 1 b 4
#> 2 1 c a
#> 3 1 c d
#> 4 2 b 5
#> 5 2 c b
#> 6 2 c e
#> 7 3 b 6
#> 8 3 c c
#> 9 3 c f
由 reprex package (v0.3.0)
于 2021-02-23 创建