我有一个包含重复信息和空白的列的数据框。例如,假设数据框同时具有START_DATE和BEGIN_DATE。他们都代表着同样的事情。数据如下所示:
START_DATE BEGIN_DATE
---------- ----------
NA 10/10/2011
NA 12/12/2011
9/4/2011 9/4/2011
3/22/2014 3/22/2014
5/5/2011 NA
我想:
DATE
-------
10/10/2011
12/12/2011
9/4/2011
3/22/2014
5/5/2011
由于以下几个原因,这不起作用:
transform(df, DATE = if(is.na(START_DATE)) BEGIN_DATE else START_DATE)
在R中执行此操作的正确方法是什么?
答案 0 :(得分:1)
这将正确处理因素:
with(dat, pmin(as.character(START_DATE) , as.character(BEGIN_DATE), na.rm=TRUE))
答案 1 :(得分:1)
大多数数据库实现都有一个名为coalesce
的函数。遗憾的是基础R中缺少这个,但是我创建了一个。对于只有两列,它可能会被过度杀死,但如果你有更多,它可以正常工作,或者如果你想提供一个默认值,如果所有都缺失。另外,此方法将保留Date类
此代码可在此处获取:coalesce.R
你会像
一样使用它d1<-c(as.Date("2011-10-10"), NA, as.Date("2011-09-04"))
d2<-c(as.Date("2011-10-10"), as.Date("2011-12-12"), NA)
coalesce(d1,d2)
# [1] "2011-10-10" "2011-12-12" "2011-09-04"
如果您安装了devtools
,则可以使用
library(devtools)
source_gist(10205794)
答案 2 :(得分:0)
使用ifelse
:
transform(df, DATE = ifelse(is.na(START_DATE), BEGIN_DATE, START_DATE))
自ifelse
converts dates to numeric以来,我们必须做一些额外的事情:
transform(df, DATE = as.Date(ifelse(is.na(START_DATE), as.character(BEGIN_DATE), as.character(START_DATE))))