[英]How can I find the column index of the first non-zero value in a row with R dplyr?
[英]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)
獲得包含每組最小值的一行,其中value
是pivot_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.