如何选择一列的最大值而不是NA';s在R的另一列?

如何选择一列的最大值而不是NA';s在R的另一列?,r,R,我在R中寻找一种方法,在那里我可以选择最大值(col1),而col2不是NA 名为df1的datafame示例 #df1 Year col1 col2 2016 4 NA # has NA 2016 2 NA # has NA 2016 1 3 # this is the max for 2016 2017 3 NA 2017 2 3 # this is the max for 2017 2017 1 3 2

我在R中寻找一种方法,在那里我可以选择最大值(col1),而col2不是NA

名为df1的datafame示例

#df1
Year  col1  col2 
2016   4     NA  # has NA
2016   2     NA  # has NA
2016   1     3  # this is the max for 2016
2017   3     NA
2017   2     3   # this is the max for 2017
2017   1     3
2018   2     4   # this is the max for 2018
2018   1     NA
我希望新的数据集只返回

Year  col1  col2 
2016   1     3
2017   2     3
2018   2     4

如果有人能帮忙,我们将不胜感激。

使用
dplyr

library(dplyr)
df1 %>% filter(!is.na(col2)) %>%
  group_by(year) %>%
  arrange(desc(col1)) %>%
  slice(1)
使用
数据。表

library(data.table)
setDT(df1)
df1[!is.na(col2), .SD[which.max(col1)], by = Year]

这在新的R会话中起作用:

library(data.table)
dt = fread("Year  col1  col2 
2016   4     NA
2016   2     NA
2016   1     3
2017   3     NA
2017   2     3
2017   1     3
2018   2     4
2018   1     NA")

dt[!is.na(col2), .SD[which.max(col1)], by = Year]
#    Year col1 col2
# 1: 2016    1    3
# 2: 2017    2    3
# 3: 2018    2    4

使用
dplyr

library(dplyr)
df1 %>% filter(!is.na(col2)) %>%
  group_by(year) %>%
  arrange(desc(col1)) %>%
  slice(1)
使用
数据。表

library(data.table)
setDT(df1)
df1[!is.na(col2), .SD[which.max(col1)], by = Year]

这在新的R会话中起作用:

library(data.table)
dt = fread("Year  col1  col2 
2016   4     NA
2016   2     NA
2016   1     3
2017   3     NA
2017   2     3
2017   1     3
2018   2     4
2018   1     NA")

dt[!is.na(col2), .SD[which.max(col1)], by = Year]
#    Year col1 col2
# 1: 2016    1    3
# 2: 2017    2    3
# 3: 2018    2    4
base R中

out <- na.omit(df1)
merge(aggregate(col1 ~ Year, out, max), out) # thanks to Rui
#  Year col1 col2
#1 2016    1    3
#2 2017    2    3
#3 2018    2    4
outIn
base R

out <- na.omit(df1)
merge(aggregate(col1 ~ Year, out, max), out) # thanks to Rui
#  Year col1 col2
#1 2016    1    3
#2 2017    2    3
#3 2018    2    4

out为什么不为
Year==2017
设置两行?@RuiBarradas查看
col1
的最大值,而不是
col2
@Gregor得到了它,我觉得它是
max(clo2)
。谢谢。
Year==2017
为什么不两行呢?@RuiBarradas看着
col1
的最大值,而不是
col2
@Gregor明白了,我觉得它是
max(clo2)
。谢谢。使用data.table时出现未使用的参数错误。使用data.table时出现未使用的参数错误。我更喜欢使用data.table,因为我在以前的代码中已经在使用这个库了@Gregor不知道为什么,我刚刚发布了一个完全有效的示例。您能否(a)验证我的可复制示例在新的R会话中对您有效,以及(b)如果它对您的实际数据仍然不起作用,请共享一个可复制示例,说明这一点?最终使其有效。我必须将我的data.fame转换成data.table才能工作。非常感谢你的帮助!是的,这就是
setDT(df1)
在我的
data.table
版本的答案中所做的。我在使用data.table时得到一个未使用的参数错误。我在使用data.table时得到一个未使用的参数错误。我更喜欢使用data.table,因为我在以前的代码中已经在使用这个库了@Gregor不知道为什么,我刚刚发布了一个完全有效的示例。您能否(a)验证我的可复制示例在新的R会话中对您有效,以及(b)如果它对您的实际数据仍然不起作用,请共享一个可复制示例,说明这一点?最终使其有效。我必须将我的data.fame转换成data.table才能工作。非常感谢你的帮助!是的,这就是
setDT(df1)
在我的
数据表中所做的。