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

问题描述 投票:0回答:2

我正在编写一个函数来将数据表转换为长格式。对于

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
,它并没有按照我想要的方式旋转。我想要实现的目标可能吗?

r dataframe data.table tidyr reshape
2个回答
5
投票

你可以使用

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

1
投票

既然您提到了

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

© www.soinside.com 2019 - 2024. All rights reserved.