如何在pivot_longer()中无需命名或索引引用从指定列到末列?
如何在pivot_longer中选取从固定起始列到末列的所有列
问题背景
需要将数据表转换为长格式,pivot_longer()的cols参数中起始列名称固定(如示例中的grip),但末列及总列数会动态变化,希望不指定末列名称或索引的情况下抓取从起始列到末列的所有列。
示例数据
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:everything()的写法出现警告,且未达到预期透视效果:
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
解决方案
该需求完全可行,问题出在grip:everything()的语法错误——everything()是返回所有列的选择器,无法直接与列名用冒号连接。正确做法是使用tidyselect包中的last_col()函数,它会自动定位数据框的最后一列,代码如下:
library(tidyverse) 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
另外,若已知需要保留的前几列(如Site和Group),也可以通过排除法实现相同效果:
data %>% pivot_longer(cols = -c(Site, Group), names_to = "Name", values_to = "value")
内容的提问来源于stack exchange,提问作者ksinva
相关产品推荐
相关产品推荐

