将多列的最后一个非NA日期结转到一列

时间:2019-08-23 14:31:05

标签: r na

我想创建一列,其中包含一系列列中的“最后一个”非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 的示例,但似乎不适用于我。任何帮助是极大的赞赏。谢谢您的宝贵时间。

3 个答案:

答案 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.locfna.omitna.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.colties.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>