pivot_longer函数使用正确性验证及参数设置疑问咨询
R数据宽表转长表问题解答
原始数据集
my_data = structure(list(col = c("A", "B", "C"), `2000-01-01` = c(86L, 43L, 73L), `2000-01-02` = c(99L, 77L, 12L)), class = "data.frame", row.names = c(NA, -3L))
对应表格展示:
| col | 2000-01-01 | 2000-01-02 |
|---|---|---|
| A | 86 | 99 |
| B | 43 | 77 |
| C | 73 | 12 |
目标格式
date col count 1 2000-01-01 A 86 2 2000-01-01 B 43 3 2000-01-01 C 73 4 2000-01-02 A 99 5 2000-01-02 B 77 6 2000-01-02 C 12
用户代码及疑问
用户编写的代码:
library(tidyr) # 为何我仅指定了"2001-01-01",却似乎处理了所有列? my_data %>% pivot_longer(!col, names_to = "2001-01-01", values_to = "count")
运行结果:
# A tibble: 6 x 3 col `2001-01-01` count <chr> <chr> <int> 1 A 2000-01-01 86 2 A 2000-01-02 99 3 B 2000-01-01 43 4 B 2000-01-02 77 5 C 2000-01-01 73 6 C 2000-01-02 12
疑问:
- 当前处理是否正确?
- 为何在
names_to中指定"2001-01-01",却还是处理了所有日期列?
问题解答
1. 当前处理是否正确?
数据内容是正确的,但列名不符合目标格式——你把存储日期的新列命名成了2001-01-01,而目标里该列的名称是date,需要调整参数修正。
2. 为什么指定"2001-01-01"却处理了所有列?
这是对pivot_longer参数功能的误解:
!col表示除col列之外的所有列都要被转为长格式,这才是所有日期列被处理的原因。names_to的作用是给转换后存储原列名的新列设置名称,不是指定要转换的列。你写的"2001-01-01"只是新列的名字,不是筛选列的条件。
正确代码
只需把names_to的参数改为"date",就能得到目标格式:
library(tidyr) my_data %>% pivot_longer(!col, names_to = "date", values_to = "count")
运行结果:
# A tibble: 6 x 3 col date count <chr> <chr> <int> 1 A 2000-01-01 86 2 A 2000-01-02 99 3 B 2000-01-01 43 4 B 2000-01-02 77 5 C 2000-01-01 73 6 C 2000-01-02 12
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

