通过选择值在数据框中生成新列

时间:2014-06-17 21:12:10

标签: r

我有一个包含重复信息和空白的列的数据框。例如,假设数据框同时具有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中执行此操作的正确方法是什么?

3 个答案:

答案 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))))