计算R中数据帧的最高值

时间:2018-05-07 21:38:07

标签: r count max

我有以下数据框(DF)。我需要计算每个站记录最大平均值的次数/年数。 temp,minumum avg。温度和最大总降水量。

在上面DF的每一行中,年份之后是最大平均值。 temp,min avg。温度和总平均值沉淀。例如,如果在1985年最高最高平均值。温度记录在站1中,它应该算作一个,依此类推。

任何建议或帮助表示赞赏。

感谢。

DF:



     St_name         Met_data
    station1       1985 15.33 4.33 780.1, 1986 12.7 2.18 505.3, 1987 17.76 6.33 793.6, 1988 17.35 4.53 541, 1989 15.65 3.98 793.7, 1990 16.9 5.96 1169.4, 1991 16.42 5.26 790.6, 1992 14.99 5.04 932.6, 1993 13.96 4.75 1420.7, 1994 14.96 3.79 668.8, 1995 15 3.67 952.9, 1996 13.77 2.4 808.5, 1997 14.69 3.26 773.5, 1998 17.22 6.25 1126.4, 1999 16.35 4.32 921.9, 2000 14.55 2.83 893.9, 2001 15.71 4.33 1118.8, 2002 15.61 3.96 1000.4, 2003 14.83 2.84 911.7, 2004 14.9 4 965.1, 2005 16.16 4.7 647.7, 2006 16.18 5.14 800.8, 2007 15.52 4.15 890.3, 2008 14.35 2.91 1271.9, 2009 14.4 3.77 1343.8, 2010 15.32 4.57 1145.4, 2011 15.41 4.54 857.3, 2012 17.39 5.4 745, 2013 15.26 3.51 811.4, 2014 13.8 2.37 986.3
    station2       1985 19.27 7.81 1465.5, 1986 20.37 8.81 1201.3, 1987 20.95 8.72 949.2, 1988 20.03 7.53 1104.6, 1989 19.11 7.42 1050.1, 1990 20.53 8.76 1486.2, 1991 20.21 9.53 1164.4, 1992 19.55 8.51 913.6, 1993 18.7 8.24 1485.1, 1994 19.43 8.42 1171.7, 1995 19.62 7.41 1084.9, 1996 19.01 6.29 1212.4, 1997 18.85 6.76 1243.2, 1998 21 8.27 1261.1, 1999 21.28 7.99 1122.4, 2000 19.99 7.74 1242.7, 2001 20.13 7.59 1305.8, 2002 20.13 7.69 1563, 2003 19.48 6.52 1237.1, 2004 19.94 7.42 1174.8, 2005 20.53 8.05 1140.5, 2006 20.16 7.18 1542, 2007 21.44 7.91 1167.8, 2008 17.6 5.51 1653.8, 2009 20.63 9.06 1326, 2010 21.31 8.7 1024.8, 2011 21.21 9.96 1847.6, 2012 22.22 9.39 782.5, 2013 20.46 9.29 770.7
    station3       1985 14.43 2.97 951.6, 1986 15.41 3.37 415.6, 1987 15.08 4.34 1110, 1988 16.19 3.33 787.6, 1989 14.77 2.19 796.8, 1990 16.28 4.59 1213.6, 1991 16.72 4.67 907.4, 1992 14.74 4.18 935.6, 1993 15.22 5.06 903.1, 1994 15.46 2.79 907.5, 1995 15.34 4.21 1001.1, 1996 14.46 2.49 1204.5, 1997 14.95 2.95 819, 1998 17.5 5.3 1078.6, 1999 16.73 3.24 901.9, 2000 15.81 2.7 931.4, 2001 16.68 4.09 968.7, 2002 16.48 6.41 762.2, 2003 15.47 4.99 999.6, 2004 15.32 5.31 875.7, 2005 16.16 5.91 593.2, 2006 16.06 6.3 997.2, 2007 15.87 5.71 946, 2008 14.46 4.1 1128.1, 2009 14.26 4.38 1146.1, 2010 15.92 4.79 1037.6, 2011 15.25 5.47 1045.8, 2012 17.47 6.43 659.2, 2013 14.25 4 1092.9, 2014 13.26 2.98 1039.4
    .
    .


Output:



  St_name    max_T_count   min_T_count   precip_count
  station1   1             0             0
  station2   0             2             0
  station3   1             1             1
    .
    .

1 个答案:

答案 0 :(得分:2)

在发布之前,您至少应该努力在电子表格中整理数据。以下代码中的前四行仅用于整理数据。我也不确定你对precip_count的要求,但至少你可以根据这个解决方案解决这个问题。

library(tidyverse)
df %>% separate_rows(Met_data, sep = ",") %>%
  mutate(Met_data = trimws(Met_data)) %>%
  separate(Met_data, sep = " ", into = c("year", "max_avg", "min_avg", "total_avg")) %>%
  group_by(year) %>%
  mutate(max_T_count = as.integer(max_avg == max(max_avg)),
         min_T_count = as.integer(min_avg == min(min_avg)),
         precip_count = as.integer(total_avg == max(total_avg))) %>%
  ungroup() %>%
  group_by(St_name) %>%
  summarise_at(vars(ends_with("count")), sum)
  • %>%magrittr包管道运算符。
  • separate_rows将逗号Met_data列的条目分隔为新行。
  • trimws修剪字符周围的额外空格。这是必要的,以使separate字符完全处于空白状态。
  • separateMet_data分隔为空白,并使用列名分配分隔的变量。
  • group_by指定聚合将在哪个分组中完成。
  • mutate创建新列。
  • summarise_at对具有指定函数的指定列进行汇总。

这些是少数。我建议您通过键入?function来解读每个文档的文档,其中function替换上面提到的每个help。或者您可以使用# A tibble: 3 x 4 # St_name max_T_count min_T_count precip_count # <fct> <int> <int> <int> # 1 station1 1 17 11 # 2 station2 29 0 5 # 3 station3 0 13 14 之类的`help(“%&gt;%”,package =“magrittr”)。

这是输出。

df <- structure(list(St_name = structure(1:3, .Label = c("station1", 
"station2", "station3"), class = "factor"), Met_data = structure(c(2L, 
3L, 1L), .Label = c("       1985 14.43 2.97 951.6, 1986 15.41 3.37 415.6, 1987 15.08 4.34 1110, 1988 16.19 3.33 787.6, 1989 14.77 2.19 796.8, 1990 16.28 4.59 1213.6, 1991 16.72 4.67 907.4, 1992 14.74 4.18 935.6, 1993 15.22 5.06 903.1, 1994 15.46 2.79 907.5, 1995 15.34 4.21 1001.1, 1996 14.46 2.49 1204.5, 1997 14.95 2.95 819, 1998 17.5 5.3 1078.6, 1999 16.73 3.24 901.9, 2000 15.81 2.7 931.4, 2001 16.68 4.09 968.7, 2002 16.48 6.41 762.2, 2003 15.47 4.99 999.6, 2004 15.32 5.31 875.7, 2005 16.16 5.91 593.2, 2006 16.06 6.3 997.2, 2007 15.87 5.71 946, 2008 14.46 4.1 1128.1, 2009 14.26 4.38 1146.1, 2010 15.92 4.79 1037.6, 2011 15.25 5.47 1045.8, 2012 17.47 6.43 659.2, 2013 14.25 4 1092.9, 2014 13.26 2.98 1039.4", 
"       1985 15.33 4.33 780.1, 1986 12.7 2.18 505.3, 1987 17.76 6.33 793.6, 1988 17.35 4.53 541, 1989 15.65 3.98 793.7, 1990 16.9 5.96 1169.4, 1991 16.42 5.26 790.6, 1992 14.99 5.04 932.6, 1993 13.96 4.75 1420.7, 1994 14.96 3.79 668.8, 1995 15 3.67 952.9, 1996 13.77 2.4 808.5, 1997 14.69 3.26 773.5, 1998 17.22 6.25 1126.4, 1999 16.35 4.32 921.9, 2000 14.55 2.83 893.9, 2001 15.71 4.33 1118.8, 2002 15.61 3.96 1000.4, 2003 14.83 2.84 911.7, 2004 14.9 4 965.1, 2005 16.16 4.7 647.7, 2006 16.18 5.14 800.8, 2007 15.52 4.15 890.3, 2008 14.35 2.91 1271.9, 2009 14.4 3.77 1343.8, 2010 15.32 4.57 1145.4, 2011 15.41 4.54 857.3, 2012 17.39 5.4 745, 2013 15.26 3.51 811.4, 2014 13.8 2.37 986.3", 
"       1985 19.27 7.81 1465.5, 1986 20.37 8.81 1201.3, 1987 20.95 8.72 949.2, 1988 20.03 7.53 1104.6, 1989 19.11 7.42 1050.1, 1990 20.53 8.76 1486.2, 1991 20.21 9.53 1164.4, 1992 19.55 8.51 913.6, 1993 18.7 8.24 1485.1, 1994 19.43 8.42 1171.7, 1995 19.62 7.41 1084.9, 1996 19.01 6.29 1212.4, 1997 18.85 6.76 1243.2, 1998 21 8.27 1261.1, 1999 21.28 7.99 1122.4, 2000 19.99 7.74 1242.7, 2001 20.13 7.59 1305.8, 2002 20.13 7.69 1563, 2003 19.48 6.52 1237.1, 2004 19.94 7.42 1174.8, 2005 20.53 8.05 1140.5, 2006 20.16 7.18 1542, 2007 21.44 7.91 1167.8, 2008 17.6 5.51 1653.8, 2009 20.63 9.06 1326, 2010 21.31 8.7 1024.8, 2011 21.21 9.96 1847.6, 2012 22.22 9.39 782.5, 2013 20.46 9.29 770.7"
), class = "factor")), .Names = c("St_name", "Met_data"), class = "data.frame", row.names = c(NA, 
-3L))

这是数据。

#!/usr/bin/env bash

# setup escape codes based on out output format
RD="\e[0;31m"
GN="\e[0;32m"
LG="\e[0;37m"
BL="\e[0;34m"

# return an evil star if git repo is dirty
git_dirty() {
    ERROR="${RD}✘ "
    git diff-files --no-ext-diff --quiet
    if [[ $? -gt 0 ]]; then
        echo -ne "$ERROR"
        return 0
    fi

    git diff-index --no-ext-diff --quiet --cached HEAD
    if [[ $? -gt 0 ]]; then
        echo -ne "$ERROR"
        return 0
    fi

    echo -ne "${GN}✓ "
}

# format current git branch
BRANCH=$(git symbolic-ref -q HEAD 2> /dev/null | sed -e 's|^refs/heads/||')
if [[ -z "${BRANCH// }" ]]; then
    echo -ne ""
else
    echo -ne "${LG}[${BL}$BRANCH`git_dirty`${LG}]"
fi