创建具有缺失值的新变量

时间:2013-03-11 16:51:33

标签: r if-statement

以下是一些示例数据。

vv  var1    var2
1   a   1/1/2010
1   c   1/3/2010
2   d   1/6/2010
3   a   1/8/2010
3   c   1/9/2010
4   a   1/10/2010
4   b   1/11/2010
5   d   1/13/2010
6   a   1/16/2010
6   b   1/17/2010
7   a   1/19/2010
7   b   1/20/2010
8   d   1/22/2010
9   a   1/25/2010
9   c   1/27/2010

我正在尝试创建新变量,由其他变量的响应填充。我觉得这很容易。例如,我尝试过类似下面的内容。

data$new1[data$var1=="a"]<-data$var2
#or
data$new1[data$var1=="b" | data$var1=="c"]<-data$var2

我收到错误number of items to replace is not of replacement length。在我的数据中,并非每个var1=="a"都有var2值,所以我不确定为什么r不只是为缺失值分配NA,这是我可以接受的(实际上更喜欢它) 。基本上,我希望r为任何new1提供var1!="a" NA值。

我也试过

if (data$var1=="a") {data$new1<-data$var2} else {data$new1<-"NA"}

但我收到错误the condition has length > 1 and only the first element will be used

现在,我想我可以将我的数据子集化为仅包含var1=="a"的数据,然后分配我的值,然后使用all=T选项合并回主数据集以获取NA的估算,但我真的想避免这样做。

我不确定问题是什么。任何建议都非常感谢。欢呼声。

以下方法输出以运行代码:

data$new1 <- ifelse(data$var1 %in% c("b","c"),data$var2,NA)

       vv var1      var2 new1
    1   1    a  1/1/2010   NA
    2   1    c  1/3/2010   12
    3   2    d  1/6/2010   NA
    4   3    a  1/8/2010   NA
    5   3    c  1/9/2010   15
    6   4    a 1/10/2010   NA
    7   4    b 1/11/2010    3
    8   5    d 1/13/2010   NA
    9   6    a 1/16/2010   NA
    10  6    b 1/17/2010    6
    11  7    a 1/19/2010   NA
    12  7    b 1/20/2010    8
    13  8    d 1/22/2010   NA
    14  9    a 1/25/2010   NA
    15  9    c 1/27/2010   11

2 个答案:

答案 0 :(得分:1)

由于您尚未提供样本数据,因此此代码未经测试

data$new1 <- rep(NA, nrow(data))
data$new1[data$var1=="A"] <- data$var2[data$var1=="A"]

此处的关键是为data$var1=="A"data$new1设置相同的子集参数(data$var2)。

这种方法的优点是子集不必只是相等而是任何逻辑表达式。

答案 1 :(得分:1)

如果我理解正确,我认为您希望使用ifelse%in%来执行此任务:

data$new1 <- ifelse(data$var1 %in% c("A","B"),data$var2,NA)

你所执行的是子集化,它通常会返回更小的值,因此会出现警告。