2017-04-05 54 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

相关问题