我创建新变量时出了什么问题?

时间:2016-09-15 19:45:07

标签: r

我想根据对原始变量施加的条件创建一个新变量。让我们说

  • 原始变量" var",是一个由1 ... 20的随机样本组成的向量,
  • 新变量" newvar"当原始" var"被设置为缺失大于10,等于" var"什么时候" var"小于10。

以下代码描述了该程序,

> mydata <- data.frame(var=sample(1:20))
> mydata$newvar <- rep(NA, nrow(mydata))
> mydata$newvar[mydata$var < 10] <- mydata$var
Warning message:
In mydata$newvar[mydata$var < 10] <- mydata$var :
  number of items to replace is not a multiple of replacement length

如警告信息所示,结果很糟糕。例如,在第4行和第5行中,&#34; newvar&#34;被赋予&#34; var&#34;的值。分别在第2行和第3行。你能告诉我出了什么问题吗?

> mydata
   var newvar
1    3      3
2   16     NA
3   13     NA
4    5     16
5    7     13
6   19     NA
7    4      5
8   17     NA
9    9      7
10  20     NA
11  14     NA
12   8     19
13  10     NA
14   6      4
15   1     17
16  11     NA
17  18     NA
18  15     NA
19   2      9
20  12     NA

我对R相对较新,并且仍在学习如何操纵变量和数据。要创建新变量,我理解我可以循环遍历需要更改的索引,如下所示

mydata$newvar <- rep(NA, nrow(mydata))  
loop_through_these <- which(mydata$var < 10)

for(i in loop_through_these){

  mydata$newvar[i] <- mydata$var[i]
}
> mydata
    var newvar
1    3      3
2   16     NA
3   13     NA
4    5      5
5    7      7
6   19     NA
7    4      4
8   17     NA
9    9      9
10  20     NA
11  14     NA
12   8      8
13  10     NA
14   6      6
15   1      1
16  11     NA
17  18     NA
18  15     NA
19   2      2
20  12     NA

这虽然不是最有效的,但却给了我正确的结果。我仍然认为有一种比使用循环更有效的方法。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用ifelsewhich执行此操作。使用ifelse,您无需先创建NA列:

mydata$newvar <- ifelse(mydata$var < 10, mydata$var, NA)

如果您已经创建了NA列,则可以使用:

mydata$newvar[which(mydata$var < 10)] <- mydata$var[which(mydata$var < 10)]