我在这里有一些代表性子部分的数据
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”)中的错误: 选择了未定义的列
答案 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