2017-04-05 57 views
1

我試圖創建一個新的變量,由其他列基於第三列中的值填充。例如,考慮下面的數據:根據另一列有條件地選擇多個其他列的值創建新列

x our1 our2 our3 our4 our5  
4 10  50  40  30  20 
1 20  10  50  40  30 
3 30  20  10  50  40 
2 40  30  20  10  50 
5 50  40  30  20  10 

我想創建一個新列「Y」將從要麼OUR1,外環OUR2,our3,our4,或our5基於價值填充「X」。如果x的值是1,y將取our1的值;如果「x」的值是2,y將取our2的值;等等。對於上面的例子,它將填充了這種方式:

x our1 our2 our3 our4 our5 y 
4 10  50  40  30  20  30 
1 20  10  50  40  30  20 
3 30  20  10  50  40  10 
2 40  30  20  10  50  30 
5 50  40  30  20  10  10 

這裏是我使用的代碼:

df$y <- NA 
df$y[df$x==1]<-df$our1[df$x==1] 
df$y[df$x==2]<-df$our2[df$x==2] 
df$y[df$x==3]<-df$our3[df$x==3] 
df$y[df$x==4]<-df$our4[df$x==4] 
df$y[df$x==5]<-df$our5[df$x==5] 

但是,當我使用此代碼,它在錯誤的列填充值新專欄y。實際上,我有22列,我的代碼應該從中拉出來。但是隻有來自our1的值纔會轉到正確行中的列y。 our2的值轉到x = 12的行,our3的值轉到x = 16的行,our4的值轉到x = 17的行等。

有沒有什麼我是做錯了代碼?關於問題是什麼以及我如何解決它的任何想法?

謝謝!

回答

1

我們可以通過row/column索引輕鬆完成此操作。使用的「x」列作爲列索引,cbind與行的順序來提取數據集中的所述子集的元素(不「x」的柱 - df[-1]

df$y <- df[-1][cbind(1:nrow(df), df$x)] 
df$y 
#[1] 30 20 10 30 10 
+0

感謝@akrun。我嘗試了這個策略,但似乎沒有奏效。我有一個1880行和許多列的數據集。我將數據集分爲只有x列和22個「我們」列(即our1,our2,our3等)。然後我嘗試填充y列: df $ y < - df [-1] [cbind(1:nrow(df),df $ x)] 像您所建議的那樣。但是,當我嘗試查看前5行時,它給了我這個錯誤: 錯誤(函數(類,fdef,mtable): 無法找到函數'as.item'的簽名'「列表的繼承方法」 '。任何關於什麼可能出錯的想法?​​ – tlev

+0

@tlev我想你可能已經對錯誤的列進行了子集化,我認爲你需要而不是'df [-1]'即'df [grep(「our」,names(df ))'' – akrun

+0

thanks @akrun。我剛剛使用了這個命令:df $ y < - df [grep(「our」,names(df))] [cbind(1:nrow(df),df $ x)]但當我嘗試查看新列的前5行時,我仍然收到同樣的錯誤,我從來沒有用過這種方式使用過cbind,我不明白這個代碼是如何知道從哪個列中提取的。在第x列中的數字處,然後找到具有該數字的列名稱以選擇從哪個列中抽取? – tlev

相關問題