0

这是一些示例数据。

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任何 NA 值var1!="a"

我也试过

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
4

2 回答 2

1

由于您没有提供示例数据,因此此代码未经测试

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

此处的关键是和具有相同的子集参数 ( data$var1=="A") 。data$new1data$var2

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

于 2013-03-11T16:55:51.007 回答
1

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

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

您执行的是子集化,这通常会返回较小的值,因此您会收到警告。

于 2013-03-11T16:56:03.037 回答