簡體   English   中英

R dplyr purrr 查找跨多個列的列最小值的索引值和索引處的相應行值

[英]R dplyr purrr find index value of column minimum across multiple columns and corresponding row value at index

我有一個空氣污染值數據集,每個數據集對應於一個特定的站點。 我已經計算了每個空氣污染變量和站點代碼的空值數。 現在我想找到具有最少空值的每種污染物的站點。

這是數據集:

nulls_by_code
# A tibble: 34 x 9
   code    nox   no2    o3   so2    co pm10_raw  pm10  pm25
   <chr> <int> <int> <int> <int> <int>    <int> <int> <int>
 1 BL0    7195  1386  1234  4933 24408    24408  2981  2092
 2 BQ7     240   240   229 24392 24392      310   326 24392
 3 BQ8   24296 24296 24296 24296 24296    24296   323 24296
 4 CR8   24395 24395 24395 24395 24395    24395 24395   733
 5 CT3    1055  1055 24393 24393 24393     2365   971  2888
 6 EI3    1994  1994 24283 24283 24283    24283  3801 24283
 7 EN7     271   271 24392 24392 24392    24392 24392 24392
 8 HG4     205   205  1048 24392 24392    24392 24392 24392
 9 HP1   24391  8610  9596 24391 24391    24391  7987  8255
10 HP3   15633 15633 15633 15633 15633    15633 15633 15633
# … with 24 more rows

我已經閱讀了一些關於類似問題的帖子,但它們並不是我想要的。 我的數據中沒有分組變量,我想計算每一列的最小值和相應的代碼,例如:

nulls_by_code %>% 
     summarise(across(nox:pm25, ~ slice(which.min(.)))) %>% 
     mutate(across(nox:pm25, code)) ## I know this won't work, not sure which verb to use!

我看過: 查找最小值的列和最小值的相應行,條件是另一列多列中每行的最小值(或最大值)以及如何選擇每組中最大值但沒有的行其中有讓我進入 dplyr 數據框必殺技。

結果應該看起來像這樣,或者是的轉置版本,以確保列具有相同的數據類型並且不混合 and 。


+-----------+-----+-----+------+------+
| row_name  | nox | no2 | pm10 | pm25 |
+-----------+-----+-----+------+------+
| min_value | 205 | 205 | 323  | 733  |
| min_code  | HG4 | HG4 | BQ8  | CR8  |
+-----------+-----+-----+------+------+

我懷疑 dplyr 大師 @akrun 將能夠在 10 秒內解決這個問題...... :-) 感謝您提供的任何幫助。

通過tidyr::pivot_longer轉換為長格式並使用dplyr::top_n可以這樣實現:

由於您想要每種污染物的最小值,我們首先按pollutant分組,並通過使用top_n(1, -value)獲得包含每組最小值的一行,其中valuepivot_longer分配的默認名稱。

nulls_by_code <- read.table(text = "code    nox   no2    o3   so2    co pm10_raw  pm10  pm25
  1 BL0    7195  1386  1234  4933 24408    24408  2981  2092
2 BQ7     240   240   229 24392 24392      310   326 24392
3 BQ8   24296 24296 24296 24296 24296    24296   323 24296
4 CR8   24395 24395 24395 24395 24395    24395 24395   733
5 CT3    1055  1055 24393 24393 24393     2365   971  2888
6 EI3    1994  1994 24283 24283 24283    24283  3801 24283
7 EN7     271   271 24392 24392 24392    24392 24392 24392
8 HG4     205   205  1048 24392 24392    24392 24392 24392
9 HP1   24391  8610  9596 24391 24391    24391  7987  8255
10 HP3   15633 15633 15633 15633 15633    15633 15633 15633", header = TRUE)

library(dplyr)
library(tidyr)

nulls_by_code %>% 
  pivot_longer(-code, names_to = "pollutant") %>% 
  group_by(pollutant) %>% 
  top_n(1, -value)
#> # A tibble: 8 x 3
#> # Groups:   pollutant [8]
#>   code  pollutant value
#>   <chr> <chr>     <int>
#> 1 BL0   so2        4933
#> 2 BQ7   o3          229
#> 3 BQ7   pm10_raw    310
#> 4 BQ8   pm10        323
#> 5 CR8   pm25        733
#> 6 HG4   nox         205
#> 7 HG4   no2         205
#> 8 HP3   co        15633

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM