2016-09-15 41 views
0

我想根據施加在原始變量上的條件創建一個新變量。比方說,當我創建一個新變量時出了什麼問題?

  • 原始變量,「無功」,是一個矢量由一個隨機抽樣的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行中,「newvar」分別在第2行和第3行中分配了「var」的值。你能告訴我哪裏出了問題嗎?

> 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 

這雖然不是最有效的,給了我正確的結果。我仍然認爲比使用循環更有效。您的幫助將不勝感激。

+0

它的工作完美,感謝! – TCL

回答

1

只需使用mydata$newvar <- with(mydata, ifelse(var < 10, var, NA))

你甚至沒有提到你得到的警告信息。正確的方法是:

mydata$newvar[mydata$var < 10] <- mydata$var[mydata$var < 10] 

否則雙方的長度不匹配。

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)] 
+2

'哪()'沒有必要。 – RHertel

+0

好點@RHertel。我使用它是因爲OP確實並認爲文檔可能會有所幫助,但你沒錯,正如李哲元的回答所顯示的那樣。 – Matt

相關問題