如何在下载的作业中解决NA问题

时间:2016-12-25 11:45:57

标签: r

我在这里有一些代表性子部分的数据

id     visitdate   ecgday
5130   1999-09-22  1999-09-22
6618   NA          1999-12-01 
10728  2000-06-27  2000-06-27
968    1999-04-19  1999-04-19
5729   1999-09-23  NA
1946   NA          NA
15070  1999-11-09  NA

我想要的是创建一个新的变量visitday,它等于ecgday,除非ecgday是NA。在这种情况下,它应该是visitday -> visitdate,除非visitdate和ecgday都是NA,其中visitday应该是NA。

我试过了

int99$visitday <- int99$visitdate    
int99$visitday[!is.na(int99$ecgday) & int99$ecgday > int99$visitdate]   
     <-int99$ecgday[!is.na(int99$ecgday) & int99$ecgday > int99$visitdate]

但它给出了错误:

  

[.data.frame(int99,,c(“id”,“visitday”,“visitdate”)中的错误:         选择了未定义的列

我明白了。获得所需结果的任何解决方法?

3 个答案:

答案 0 :(得分:3)

这应该这样做:

首先,如果ecday是NA,它将是访问日,如果不是ecgday

int99$visitday <- felse(is.na(int99$ecgday), int99$visitdate , int99$ecgday)

对于两者都有NA的情况,您可以添加下一个ifelse:

int99$visitday <- ifelse(is.na(int99$visitdate), int99$ecgday , int99$visitdate)

答案 1 :(得分:1)

感谢Derek Corcoran

尽管ecgday和visitdate都是Date,但除了一个非常小的事情,即访问日最终成为数字之外,这是有效的。

通过添加一行

可以很容易地解决这个问题
int99$visitday <- ifelse(is.na(int99$ecgday), int99$visitdate , int99$ecgday)
int99$visitday <- ifelse(is.na(int99$visitdate), int99$ecgday , int99$visitdate)
int99$visitday <- as.Date(int99$visitday, origin="1970-01-01")

非常感谢你。

答案 2 :(得分:0)

在我看来,处理这种NA比较的最佳方法是将日期更改为数字,将所有NAs更改为0.虽然很可能我没有正确理解问题,以防您想要将新变量设置为更高访问日期和ecgday,你可以试试这个。 或者它可以适应任何其他要求

int99<- read.table(header = T, colClasses = c("numeric", "Date","Date"),
text="id visitdate ecgday
5130 1999-09-22 1999-09-22
6618 NA 1999-12-01 
10728 2000-06-27 2000-06-27
968 1999-04-19 1999-04-19
5729 1999-09-23 NA
1946 NA NA
15070 1999-11-09 NA" )

dt<- apply(int99[,2:3], 2 , zoo::as.Date)
dt  
dt[is.na(dt)]<- 0
dt  
mx<- apply(dt,1,max)

mx[mx==0]<- NA

int99$visitday<- zoo::as.Date(mx)

int99