2015-05-07 76 views
0

我有一个复杂的问题,我会尽量简化我的数据集,以简化。说我有5个变量:如何创建与不同的变量值的新变量,如果另一变量等于R中设定值?

df$Id <- c(1:12) 
df$Date <- c(NA,NA,a,a,b,NA,NA,b,c,c,b,a) 
df$va <- c(1.1, 1.4, 2.5, ...)  #12 randoms values 
df$vb <- c(5.9, 2.3, 4.7, ...)  #12 other random values 
df$vc <- c(3.0, 3.3, 3.7, ...)  #12 more random values 

然后我想创建一个新的变量,需要从VA,VB或VC的值,如果日期是等于a,b或c。我试过了一个嵌套的if-else,这不起作用。我也试过:

df$new[df$date=='a' & !is.na(df$date)] <- df$va 
df$new[df$date=='b' & !is.na(df$date)] <- df$vb 
df$new[df$date=='c' & !is.na(df$date)] <- df$vc 

此留下正确NA的新变量,其中日期= NA,但提供的值不从VA,VB,或VC,但其他一些价值干脆。如果日期是'a',如何获得df $新的等于va,如果日期是'b',vb是否等于vb,如果日期是'c',vc是什么?

+0

想要'ifelse'函数。的 –

+0

可能重复的[如何如果另一个变量等于R中的一组值创建与来自不同的变量值的新变量?](http://stackoverflow.com/questions/30113308/how-to-create-a-new-可变值与来自不同变量 - 如果另一个变种) – LJW

回答

1

你想要ifelse功能,这是一个矢量条件:

> x <- c(1, 1, 0, 0, 1) 
> y <- c(1, 2, 3, 4, 5) 
> z <- c(6, 7, 8, 9, 10) 
> ifelse(x == 1, y, z) 
[1] 1 2 8 9 5 

你将不得不嵌套调用这个函数,像这样:

> x_1 <- c(1, 1, 0, 0, 1) 
> x_2 <- c(1, 1, 1, 0, 1) 
> y_1 <- c(1, 2, 3, 4, 5) 
> y_2 <- c(6, 7, 8, 9, 10) 
> z <- c(0, 0, 0, 0, 0) 
> ifelse(x_1 == 1, y_1, 
+ ifelse(x_2 == 1, y_2, z) 
+) 
[1] 1 2 8 0 5 

你的第二次尝试将如果你成功做了如下修改:

df$new[df$date=='a' & !is.na(df$date)] <- df$va[df$date=='a' & !is.na(df$date)] 

为了避免新变量becomi ng列表而不是数字变量,请使用%代替==:

df$new[df$date %in% 'a' & !is.na(df$date)] <- df$va[df$date %in% 'a' & !is.na(df$date)] 
+0

谢谢马修。我没有尝试过你建议的ifelse,尽管看起来它会起作用。发布后,我在这里有人告诉我,问题是我没有把索引放在双方,我尝试过,并且工作。 –

相关问题