我正在编写一个函数来将数据表转换为长格式。对于
cols =
参数,第一列的名称将始终相同,但最后一列(和列数)将会改变。有没有办法在不命名或不按索引的情况下获取列的“其余”部分?
假设我有这个样本数据:
data <- structure(list(Site = c("A", "B"), Group = c("1", "2"), grip = c("S",
"H"), height = c("S", "T"), width = c("W", "N"), QA = c("Y",
"N")), class = "data.frame", row.names = c(NA, -2L))
看起来像这样:
Site Group grip height width QA
1 A 1 S S W Y
2 B 2 H T N N
有时数据集会有更多列。假设我想要获取列
grip:QA
,而不命名 QA,或给出其索引号。我尝试了以下方法:
data %>%
pivot_longer(cols = grip:everything(),
names_to = "Name",
values_to = "value")
但是我收到警告
Warning message: In x:y : numerical expression has 6 elements: only the first used
,它并没有按照我想要的方式旋转。我想要实现的目标可能吗?
你可以使用
last_col
:
library(tidyr)
data %>%
pivot_longer(
cols = grip:last_col(),
names_to = "Name",
values_to = "value"
)
#> # A tibble: 8 × 4
#> Site Group Name value
#> <chr> <chr> <chr> <chr>
#> 1 A 1 grip S
#> 2 A 1 height S
#> 3 A 1 width W
#> 4 A 1 QA Y
#> 5 B 2 grip H
#> 6 B 2 height T
#> 7 B 2 width N
#> 8 B 2 QA N
或者作为另一个选项,使用
!
或 -
进行透视时排除您不想包含的列:
data %>%
pivot_longer(
cols = !c(Site, Group),
names_to = "Name",
values_to = "value"
)
#> # A tibble: 8 × 4
#> Site Group Name value
#> <chr> <chr> <chr> <chr>
#> 1 A 1 grip S
#> 2 A 1 height S
#> 3 A 1 width W
#> 4 A 1 QA Y
#> 5 B 2 grip H
#> 6 B 2 height T
#> 7 B 2 width N
#> 8 B 2 QA N
既然您提到了
data.table
,这里有一个使用data.table::melt
的解决方案:
library(data.table)
melt(setDT(data), id.vars = 2:which(colnames(data) == "grip")-1)
#> Site Group variable value
#> 1: A 1 grip S
#> 2: B 2 grip H
#> 3: A 1 height S
#> 4: B 2 height T
#> 5: A 1 width W
#> 6: B 2 width N
#> 7: A 1 QA Y
#> 8: B 2 QA N
创建于 2024-01-08,使用 reprex v2.0.2