如何在不命名或提供索引号的情况下引用pivot_longer() 中的最后一列?

ksi*_*nva 4 r reshape dataframe data.table tidyr

我正在编写一个函数来将数据表转换为长格式。对于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))
Run Code Online (Sandbox Code Playgroud)

看起来像这样:

  Site Group grip height width QA
1    A     1    S      S     W  Y
2    B     2    H      T     N  N
Run Code Online (Sandbox Code Playgroud)

有时数据集会有更多列。假设我想获取 columns grip:QA,而不命名 QA,或给出其索引号。我尝试了以下方法:

data %>%
  pivot_longer(cols = grip:everything(),
               names_to = "Name",
               values_to = "value")

Run Code Online (Sandbox Code Playgroud)

但我收到了警告Warning message: In x:y : numerical expression has 6 elements: only the first used,它并没有按照我想要的方式旋转。我想要实现的目标可能吗?

ste*_*fan 5

你可以使用last_col

\n
library(tidyr)\n\ndata %>%\n  pivot_longer(\n    cols = grip:last_col(),\n    names_to = "Name",\n    values_to = "value"\n  )\n#> # A tibble: 8 \xc3\x97 4\n#>   Site  Group Name   value\n#>   <chr> <chr> <chr>  <chr>\n#> 1 A     1     grip   S    \n#> 2 A     1     height S    \n#> 3 A     1     width  W    \n#> 4 A     1     QA     Y    \n#> 5 B     2     grip   H    \n#> 6 B     2     height T    \n#> 7 B     2     width  N    \n#> 8 B     2     QA     N\n
Run Code Online (Sandbox Code Playgroud)\n

!或者作为另一个选项,使用或进行透视时排除您不想包含的列-

\n
data %>%\n  pivot_longer(\n    cols = !c(Site, Group),\n    names_to = "Name",\n    values_to = "value"\n  )\n#> # A tibble: 8 \xc3\x97 4\n#>   Site  Group Name   value\n#>   <chr> <chr> <chr>  <chr>\n#> 1 A     1     grip   S    \n#> 2 A     1     height S    \n#> 3 A     1     width  W    \n#> 4 A     1     QA     Y    \n#> 5 B     2     grip   H    \n#> 6 B     2     height T    \n#> 7 B     2     width  N    \n#> 8 B     2     QA     N\n
Run Code Online (Sandbox Code Playgroud)\n