r - 在 tidyverse 中每行整理多个观察值
问题描述
我有每行有多个观察值的数据,我想整理这些数据。
数据是卫星传感器集合的相对光谱响应 (RSR)。我制作了一个代表此处实际数据的玩具数据集。每个传感器/波段有两列,一列是测试它的波长范围(“Wvln(nm)”),另一列是该传感器的响应(“RSR”)。在我的玩具数据中,波段 1 对 500 nm 有强烈响应,波段 2 对 600 nm 有强烈响应。
library(tidyverse)
rsr_toy <- tibble::tribble(
~`Band 1`, ~`...2`, ~`Band 2`, ~`...4`,
"Wvln(nm)", "RSR", "Wvln(nm)", "RSR",
"500", "0.9", "500", "0.01",
"600", "0.12", "600", "0.8"
)
# remove the first row containing metadata
rsr1 <- rsr_toy %>%
slice(-1) %>%
janitor::clean_names("small_camel") %>%
rsr1
# # A tibble: 2 x 4
# band1 x2 band2 x4
# <chr> <chr> <chr> <chr>
# 1 500 0.9 500 0.01
# 2 600 0.12 600 0.8
我想整理数据,所以每个观察都有自己的行,如下所示:
# desired outcome:
tibble::tribble(
~sensor, ~wavelength, ~rsr,
"band1", 500, 0.9,
"band1", 600, 0.12,
"band2", 500, 0.01,
"band2", 600, 0.8
)
# # A tibble: 4 x 3
# sensor wavelength rsr
# <chr> <dbl> <dbl>
# 1 band1 500 0.9
# 2 band1 600 0.12
# 3 band2 500 0.01
# 4 band2 600 0.8
如何使用 tidyr 简单地完成此任务?
解决方案
获取长格式数据,重命名列并创建sensor
列。
library(tidyverse)
rsr1 %>%
pivot_longer(cols = everything(),
names_to = '.value',
names_pattern = '(.*?)\\d') %>%
rename(wavelength = band, rsr = x) %>%
mutate(sensor = rep(str_subset(names(rsr1), 'band'), length.out = n()),
.before = 1)
# sensor wavelength rsr
# <chr> <chr> <chr>
#1 band1 500 0.9
#2 band2 500 0.01
#3 band1 600 0.12
#4 band2 600 0.8
推荐阅读
- javascript - 如何使用 javascript 显示或隐藏基于文本框输入的面板?
- html - 使用登录在网站后面卷曲 HTML 内容(手稿状态跟踪)
- javascript - 正则表达式:忽略转义项(Javascript)
- javascript - Stackoverflow 如何防止页面加载之间的“白闪”?
- c# - ASP.NET MVC:CS1061 错误
- sql - 避免当前筛选器的 Tableau 参考线
- php - 如何动态调用危险的 PHP 函数来开发概念验证?
- php - 在请求之间保留查询字符串 Laravel
- user-interface - 如何使用画布分析球拍 gui 代码
- ios - 使用 DispatchGroup 填充对象的数组无法正常工作