如何选择一列的最大值而不是NA';s在R的另一列?
我在R中寻找一种方法,在那里我可以选择最大值(col1),而col2不是NA 名为df1的datafame示例如何选择一列的最大值而不是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
#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
outInbase 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)
在我的数据表中所做的。