Home > Blockchain >  Find a maximum value for multiple entries in a column
Find a maximum value for multiple entries in a column

Time:02-28

I have this dataset

##   X Sector Octant Distance_m Yr1951    Yr1952   Yr1953    Yr1954    Yr1955
## 1 1    B01     NW       1600      0  4.167226 15.79016  23.24586  23.24586
## 2 2    B02      N       1600      0  8.070090 30.57861  45.01705  45.01705
## 3 3    B03     NE       1600      0 19.917085 75.46840 111.10264 111.10264
## 4 4    B04     NW       3200      0  3.140495 11.89974  17.51849  17.51849
## 5 5    B05     NW       3200      0  3.140495 11.89974  17.51849  17.51849
## 6 6    B06      N       3200      0  6.081763 23.04458  33.92564  33.92564
##      Yr1956    Yr1957    Yr1958    Yr1959    Yr1960    Yr1961    Yr1962
## 1  23.24586  23.24586  24.64390  28.83804  28.83804  28.83804  28.83804
## 2  45.01705  45.01705  47.72445  55.84665  55.84665  55.84665  55.84665
## 3 111.10264 111.10264 117.78453 137.83023 137.83023 137.83023 137.83023
## 4  17.51849  17.51849  18.57208  21.73285  21.73285  21.73285  21.73285
## 5  17.51849  17.51849  18.57208  21.73285  21.73285  21.73285  21.73285
## 6  33.92564  33.92564  35.96599  42.08702  42.08702  42.08702  42.08702
##      Yr1963    Yr1964    Yr1965    Yr1966    Yr1967    Yr1968    Yr1969
## 1  28.83804  28.83804  28.83804  28.83804  28.83804  28.83804  28.83804
## 2  55.84665  55.84665  55.84665  55.84665  55.84665  55.84665  55.84665
## 3 137.83023 137.83023 137.83023 137.83023 137.83023 137.83023 137.83023
## 4  21.73285  21.73285  21.73285  21.73285  21.73285  21.73285  21.73285
## 5  21.73285  21.73285  21.73285  21.73285  21.73285  21.73285  21.73285
## 6  42.08702  42.08702  42.08702  42.08702  42.08702  42.08702  42.08702
##      Yr1970    Yr1971    Yr1972    Yr1973    Yr1974    Yr1975    Yr1976
## 1  28.83804  28.83804  28.83804  28.83804  28.83804  28.83804  28.83804
## 2  55.84665  55.84665  55.84665  55.84665  55.84665  55.84665  55.84665
## 3 137.83023 137.83023 137.83023 137.83023 137.83023 137.83023 137.83023
## 4  21.73285  21.73285  21.73285  21.73285  21.73285  21.73285  21.73285
## 5  21.73285  21.73285  21.73285  21.73285  21.73285  21.73285  21.73285
## 6  42.08702  42.08702  42.08702  42.08702  42.08702  42.08702  42.08702
##      Yr1977    Yr1978   Yr1979    Yr1980    Yr1981    Yr1982    Yr1983
## 1  28.83804  28.83804 16.64263  4.447229  4.447229  4.447229  4.447229
## 2  55.84665  55.84665 32.22949  8.612334  8.612334  8.612334  8.612334
## 3 137.83023 137.83023 79.54279 21.255349 21.255349 21.255349 21.255349
## 4  21.73285  21.73285 12.54218  3.351510  3.351510  3.351510  3.351510
## 5  21.73285  21.73285 12.54218  3.351510  3.351510  3.351510  3.351510
## 6  42.08702  42.08702 24.28871  6.490407  6.490407  6.490407  6.490407
##      Yr1984    Yr1985    Yr1986    Yr1987    Yr1988
## 1  4.447229  4.447229  4.447229  4.447229 1.1104088
## 2  8.612334  8.612334  8.612334  8.612334 2.1503755
## 3 21.255349 21.255349 21.255349 21.255349 5.3071537
## 4  3.351510  3.351510  3.351510  3.351510 0.8368237
## 5  3.351510  3.351510  3.351510  3.351510 0.8368237
## 6  6.490407  6.490407  6.490407  6.490407 1.6205609

I am wanting to separate the data out per sector and find which year for every sector had the maximum/highest exposure and have that maximum exposure displayed. How would I go about doing this? My desired output would (ideally) include the sector, the year of the highest exposure was recorded, and what that value is. Reproducible data below:

structure(list(X = 1:10, Sector = c("B01", "B02", "B03", "B04", 
"B05", "B06", "B07", "B08", "B09", "B10"), Octant = c("NW", "N", 
"NE", "NW", "NW", "N", "N", "NE", "NE", "W"), Distance_m = c(1600L, 
1600L, 1600L, 3200L, 3200L, 3200L, 3200L, 3200L, 3200L, 4800L
), Yr1951 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), Yr1952 = c(4.16722556361885, 
8.07009038922937, 19.9170847727104, 3.14049476463692, 3.14049476463692, 
6.08176260934446, 6.08176260934446, 15.0098667568185, 15.0098667568185, 
4.65320683317187), Yr1953 = c(15.7901552659006, 30.578613590843, 
75.4684036666576, 11.8997398120925, 11.8997398120925, 23.0445831227103, 
23.0445831227103, 56.8743215341634, 56.8743215341634, 17.6316009916985
), Yr1954 = c(23.2458594045635, 45.0170464032273, 111.102637787894, 
17.5184900949112, 17.5184900949112, 33.9256410267316, 33.9256410267316, 
83.7289095546898, 83.7289095546898, 25.9567883170532), Yr1955 = c(23.2458594045635, 
45.0170464032273, 111.102637787894, 17.5184900949112, 17.5184900949112, 
33.9256410267316, 33.9256410267316, 83.7289095546898, 83.7289095546898, 
25.9567883170532), Yr1956 = c(23.2458594045635, 45.0170464032273, 
111.102637787894, 17.5184900949112, 17.5184900949112, 33.9256410267316, 
33.9256410267316, 83.7289095546898, 83.7289095546898, 25.9567883170532
), Yr1957 = c(23.2458594045635, 45.0170464032273, 111.102637787894, 
17.5184900949112, 17.5184900949112, 33.9256410267316, 33.9256410267316, 
83.7289095546898, 83.7289095546898, 25.9567883170532), Yr1958 = c(24.6439039639345, 
47.724446276369, 117.78453479105, 18.5720811598549, 18.5720811598549, 
35.9659853751658, 35.9659853751658, 88.7645051172278, 88.7645051172278, 
27.517872639807), Yr1959 = c(28.8380376420477, 55.8466458957943, 
137.830225800518, 21.7328543546861, 21.7328543546861, 42.0870184204684, 
42.0870184204684, 103.871291804842, 103.871291804842, 32.2011256080683
), Yr1960 = c(28.8380376420477, 55.8466458957943, 137.830225800518, 
21.7328543546861, 21.7328543546861, 42.0870184204684, 42.0870184204684, 
103.871291804842, 103.871291804842, 32.2011256080683), Yr1961 = c(28.8380376420477, 
55.8466458957943, 137.830225800518, 21.7328543546861, 21.7328543546861, 
42.0870184204684, 42.0870184204684, 103.871291804842, 103.871291804842, 
32.2011256080683), Yr1962 = c(28.8380376420477, 55.8466458957943, 
137.830225800518, 21.7328543546861, 21.7328543546861, 42.0870184204684, 
42.0870184204684, 103.871291804842, 103.871291804842, 32.2011256080683
), Yr1963 = c(28.8380376420477, 55.8466458957943, 137.830225800518, 
21.7328543546861, 21.7328543546861, 42.0870184204684, 42.0870184204684, 
103.871291804842, 103.871291804842, 32.2011256080683), Yr1964 = c(28.8380376420477, 
55.8466458957943, 137.830225800518, 21.7328543546861, 21.7328543546861, 
42.0870184204684, 42.0870184204684, 103.871291804842, 103.871291804842, 
32.2011256080683), Yr1965 = c(28.8380376420477, 55.8466458957943, 
137.830225800518, 21.7328543546861, 21.7328543546861, 42.0870184204684, 
42.0870184204684, 103.871291804842, 103.871291804842, 32.2011256080683
), Yr1966 = c(28.8380376420477, 55.8466458957943, 137.830225800518, 
21.7328543546861, 21.7328543546861, 42.0870184204684, 42.0870184204684, 
103.871291804842, 103.871291804842, 32.2011256080683), Yr1967 = c(28.8380376420477, 
55.8466458957943, 137.830225800518, 21.7328543546861, 21.7328543546861, 
42.0870184204684, 42.0870184204684, 103.871291804842, 103.871291804842, 
32.2011256080683), Yr1968 = c(28.8380376420477, 55.8466458957943, 
137.830225800518, 21.7328543546861, 21.7328543546861, 42.0870184204684, 
42.0870184204684, 103.871291804842, 103.871291804842, 32.2011256080683
), Yr1969 = c(28.8380376420477, 55.8466458957943, 137.830225800518, 
21.7328543546861, 21.7328543546861, 42.0870184204684, 42.0870184204684, 
103.871291804842, 103.871291804842, 32.2011256080683), Yr1970 = c(28.8380376420477, 
55.8466458957943, 137.830225800518, 21.7328543546861, 21.7328543546861, 
42.0870184204684, 42.0870184204684, 103.871291804842, 103.871291804842, 
32.2011256080683), Yr1971 = c(28.8380376420477, 55.8466458957943, 
137.830225800518, 21.7328543546861, 21.7328543546861, 42.0870184204684, 
42.0870184204684, 103.871291804842, 103.871291804842, 32.2011256080683
), Yr1972 = c(28.8380376420477, 55.8466458957943, 137.830225800518, 
21.7328543546861, 21.7328543546861, 42.0870184204684, 42.0870184204684, 
103.871291804842, 103.871291804842, 32.2011256080683), Yr1973 = c(28.8380376420477, 
55.8466458957943, 137.830225800518, 21.7328543546861, 21.7328543546861, 
42.0870184204684, 42.0870184204684, 103.871291804842, 103.871291804842, 
32.2011256080683), Yr1974 = c(28.8380376420477, 55.8466458957943, 
137.830225800518, 21.7328543546861, 21.7328543546861, 42.0870184204684, 
42.0870184204684, 103.871291804842, 103.871291804842, 32.2011256080683
), Yr1975 = c(28.8380376420477, 55.8466458957943, 137.830225800518, 
21.7328543546861, 21.7328543546861, 42.0870184204684, 42.0870184204684, 
103.871291804842, 103.871291804842, 32.2011256080683), Yr1976 = c(28.8380376420477, 
55.8466458957943, 137.830225800518, 21.7328543546861, 21.7328543546861, 
42.0870184204684, 42.0870184204684, 103.871291804842, 103.871291804842, 
32.2011256080683), Yr1977 = c(28.8380376420477, 55.8466458957943, 
137.830225800518, 21.7328543546861, 21.7328543546861, 42.0870184204684, 
42.0870184204684, 103.871291804842, 103.871291804842, 32.2011256080683
), Yr1978 = c(28.8380376420477, 55.8466458957943, 137.830225800518, 
21.7328543546861, 21.7328543546861, 42.0870184204684, 42.0870184204684, 
103.871291804842, 103.871291804842, 32.2011256080683), Yr1979 = c(16.6426332897682, 
32.2294900798683, 79.5427876444474, 12.5421823029183, 12.5421823029183, 
24.2887127940458, 24.2887127940458, 59.9448492404336, 59.9448492404336, 
18.5834948849451), Yr1980 = c(4.44722893748883, 8.61233426394242, 
21.2553494883767, 3.35151025115061, 3.35151025115061, 6.49040716762317, 
6.49040716762317, 16.0184066760251, 16.0184066760251, 4.96586416182185
), Yr1981 = c(4.44722893748883, 8.61233426394242, 21.2553494883767, 
3.35151025115061, 3.35151025115061, 6.49040716762317, 6.49040716762317, 
16.0184066760251, 16.0184066760251, 4.96586416182185), Yr1982 = c(4.44722893748883, 
8.61233426394242, 21.2553494883767, 3.35151025115061, 3.35151025115061, 
6.49040716762317, 6.49040716762317, 16.0184066760251, 16.0184066760251, 
4.96586416182185), Yr1983 = c(4.44722893748883, 8.61233426394242, 
21.2553494883767, 3.35151025115061, 3.35151025115061, 6.49040716762317, 
6.49040716762317, 16.0184066760251, 16.0184066760251, 4.96586416182185
), Yr1984 = c(4.44722893748883, 8.61233426394242, 21.2553494883767, 
3.35151025115061, 3.35151025115061, 6.49040716762317, 6.49040716762317, 
16.0184066760251, 16.0184066760251, 4.96586416182185), Yr1985 = c(4.44722893748883, 
8.61233426394242, 21.2553494883767, 3.35151025115061, 3.35151025115061, 
6.49040716762317, 6.49040716762317, 16.0184066760251, 16.0184066760251, 
4.96586416182185), Yr1986 = c(4.44722893748883, 8.61233426394242, 
21.2553494883767, 3.35151025115061, 3.35151025115061, 6.49040716762317, 
6.49040716762317, 16.0184066760251, 16.0184066760251, 4.96586416182185
), Yr1987 = c(4.44722893748883, 8.61233426394242, 21.2553494883767, 
3.35151025115061, 3.35151025115061, 6.49040716762317, 6.49040716762317, 
16.0184066760251, 16.0184066760251, 4.96586416182185), Yr1988 = c(1.1104088237638, 
2.15037545723583, 5.30715372557456, 0.836823695861693, 0.836823695861693, 
1.62056091333541, 1.62056091333541, 3.99956475497726, 3.99956475497726, 
1.23990454739508)), class = "data.frame", row.names = c(NA, -10L
))

CodePudding user response:

We may use max.col to get the index of the year column and use that to subset the value

i1 <- grep("^Yr\\d ", names(df))
i2 <- max.col(df[i1], "first")
yr_name <- names(df)[i1][i2]
value <- df[i1][cbind(seq_len(nrow(df)), i2)]
out <- data.frame(df['Sector'], yr_name, value)

CodePudding user response:

You can do:

library(tidyverse)
df %>%
  pivot_longer(cols = -c(X, Sector, Octant, Distance_m)) %>%
  group_by(Sector) %>%
  summarize(max_years = list(name[which(value == max(value))])) %>%
  unnest_wider(max_years)

Alternative:

df %>%
  rowwise() %>%
  summarize(max_years = list(names(df[4   (which(c_across(starts_with("Yr")) == max(c_across(starts_with("Yr")))))]))) %>%
  unnest_wider(max_years)

which gives:

# A tibble: 10 x 21
   Sector ...1   ...2   ...3   ...4   ...5   ...6   ...7   ...8   ...9   ...10  ...11  ...12  ...13  ...14  ...15  ...16  ...17  ...18  ...19  ...20 
   <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr> 
 1 B01    Yr1959 Yr1960 Yr1961 Yr1962 Yr1963 Yr1964 Yr1965 Yr1966 Yr1967 Yr1968 Yr1969 Yr1970 Yr1971 Yr1972 Yr1973 Yr1974 Yr1975 Yr1976 Yr1977 Yr1978
 2 B02    Yr1959 Yr1960 Yr1961 Yr1962 Yr1963 Yr1964 Yr1965 Yr1966 Yr1967 Yr1968 Yr1969 Yr1970 Yr1971 Yr1972 Yr1973 Yr1974 Yr1975 Yr1976 Yr1977 Yr1978
 3 B03    Yr1959 Yr1960 Yr1961 Yr1962 Yr1963 Yr1964 Yr1965 Yr1966 Yr1967 Yr1968 Yr1969 Yr1970 Yr1971 Yr1972 Yr1973 Yr1974 Yr1975 Yr1976 Yr1977 Yr1978
 4 B04    Yr1959 Yr1960 Yr1961 Yr1962 Yr1963 Yr1964 Yr1965 Yr1966 Yr1967 Yr1968 Yr1969 Yr1970 Yr1971 Yr1972 Yr1973 Yr1974 Yr1975 Yr1976 Yr1977 Yr1978
 5 B05    Yr1959 Yr1960 Yr1961 Yr1962 Yr1963 Yr1964 Yr1965 Yr1966 Yr1967 Yr1968 Yr1969 Yr1970 Yr1971 Yr1972 Yr1973 Yr1974 Yr1975 Yr1976 Yr1977 Yr1978
 6 B06    Yr1959 Yr1960 Yr1961 Yr1962 Yr1963 Yr1964 Yr1965 Yr1966 Yr1967 Yr1968 Yr1969 Yr1970 Yr1971 Yr1972 Yr1973 Yr1974 Yr1975 Yr1976 Yr1977 Yr1978
 7 B07    Yr1959 Yr1960 Yr1961 Yr1962 Yr1963 Yr1964 Yr1965 Yr1966 Yr1967 Yr1968 Yr1969 Yr1970 Yr1971 Yr1972 Yr1973 Yr1974 Yr1975 Yr1976 Yr1977 Yr1978
 8 B08    Yr1959 Yr1960 Yr1961 Yr1962 Yr1963 Yr1964 Yr1965 Yr1966 Yr1967 Yr1968 Yr1969 Yr1970 Yr1971 Yr1972 Yr1973 Yr1974 Yr1975 Yr1976 Yr1977 Yr1978
 9 B09    Yr1959 Yr1960 Yr1961 Yr1962 Yr1963 Yr1964 Yr1965 Yr1966 Yr1967 Yr1968 Yr1969 Yr1970 Yr1971 Yr1972 Yr1973 Yr1974 Yr1975 Yr1976 Yr1977 Yr1978
10 B10    Yr1959 Yr1960 Yr1961 Yr1962 Yr1963 Yr1964 Yr1965 Yr1966 Yr1967 Yr1968 Yr1969 Yr1970 Yr1971 Yr1972 Yr1973 Yr1974 Yr1975 Yr1976 Yr1977 Yr1978

Seems that your example data has the max per sector always in Yr1959 - Yr1978.

  •  Tags:  
  • r max
  • Related