我想创建一列,其中包含一系列列中的“最后一个”非NA日期值:
import cartopy
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import matplotlib.pyplot as plt
print(cartopy.config)
ax = plt.axes(projection=ccrs.PlateCarree())
proj_info = {'central_latitude': 58,
'central_longitude': 16,
'satellite_height': 35785831,
'false_easting': 0,
'false_northing': 0,
'globe': None}
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=ccrs.NearsidePerspective(**proj_info))
ax.add_feature(cfeature.OCEAN, zorder=0)
ax.add_feature(cfeature.LAND, zorder=0, edgecolor='black')
ax.set_global()
ax.gridlines()
plt.savefig('./cartopy_test.png')
所需的输出结果是最终日期:
2018-03-01、2019-01-01、2019-06-11和NA / null作为其值。
我看过使用type<-c("a","b","c","d")
date1<-c("2019-01-01","2019-01-01",NA,NA)
date2<-c("2018-03-01",NA,NA,NA)
date3<-c(NA,NA,"2019-06-11",NA)
score<-c("y","n","y","y")
finaldate<-NA
data.frame(type,date1,date2,date3,score,finaldate)
type date1 date2 date3 score finaldate
1 a 2019-01-01 2018-03-01 <NA> y NA
2 b 2019-01-01 <NA> <NA> n NA
3 c <NA> <NA> 2019-06-11 y NA
4 d <NA> <NA> <NA> y NA
的示例,但似乎不适用于我。任何帮助是极大的赞赏。谢谢您的宝贵时间。
答案 0 :(得分:2)
我们可以使用coalesce
。根据{{1}}
给出一组向量,coalesce()在每个位置找到第一个非缺失值。
因此,我们反向选择'date'列,并使用?coalecse
选择第一个非NA元素。请注意,这里我们使用coalesce
将列设为stringsAsFactors = FALSE
而不是character
(如果列为类factor
也可以使用)
Date
还可以使用library(dplyr)
df1 %>%
mutate(finaldate = coalesce(!!! .[4:2]))
# type date1 date2 date3 score finaldate
#1 a 2019-01-01 2018-03-01 <NA> y 2018-03-01
#2 b 2019-01-01 <NA> <NA> n 2019-01-01
#3 c <NA> <NA> 2019-06-11 y 2019-06-11
#4 d <NA> <NA> <NA> y <NA>
选择感兴趣的列
tidyhelpers
或者在df1 %>%
mutate(finaldate = coalesce(!!! select(., rev(starts_with("date")))))
中,我们可以使用base R
pmax
do.call(pmax, c(df[4:2], na.rm = TRUE))
答案 1 :(得分:1)
na.locf0
可以这样使用。它也可以与na.locf
或na.omit
或na.locf0
一起使用。
library(zoo)
Last <- function(x) tail(na.locf0(x), 1)
transform(DF, finaldate = apply(DF[2:4], 1, Last))
给予:
type date1 date2 date3 score finaldate
1 a 2019-01-01 2018-03-01 <NA> y 2018-03-01
2 b 2019-01-01 <NA> <NA> n 2019-01-01
3 c <NA> <NA> 2019-06-11 y 2019-06-11
4 d <NA> <NA> <NA> y <NA>
答案 2 :(得分:0)
在基数R中,我们还可以将max.col
与ties.method = "last"
一起使用,以选择所选列中的最后一个非NA值。
cols <- grep("^date", names(df))
df$final_date <- df[cols][cbind(seq_len(nrow(df)),
max.col(!is.na(df[cols]), ties.method = "last"))]
df
# type date1 date2 date3 score final_date
#1 a 2019-01-01 2018-03-01 <NA> y 2018-03-01
#2 b 2019-01-01 <NA> <NA> n 2019-01-01
#3 c <NA> <NA> 2019-06-11 y 2019-06-11
#4 d <NA> <NA> <NA> y <NA>