在R中使用'ifelse':变量取静态值

时间:2016-04-05 14:50:05

标签: r

我正在尝试根据指标的值在数据集中创建新变量。以下是相同的代码:

prac_data <- head(iris,10)
COPY_IND='Y' ##declaring the indicator to be 'Y'
prac_data <- prac_data %>% mutate(New_Var=ifelse(COPY_IND=='Y', Sepal.Length, 'N'))

我得到以下输出:

    Sepal.Length Sepal.Width Petal.Length Petal.Width Species New_Var
1           5.1         3.5          1.4         0.2  setosa     5.1
2           4.9         3.0          1.4         0.2  setosa     5.1
3           4.7         3.2          1.3         0.2  setosa     5.1
4           4.6         3.1          1.5         0.2  setosa     5.1
5           5.0         3.6          1.4         0.2  setosa     5.1
6           5.4         3.9          1.7         0.4  setosa     5.1
7           4.6         3.4          1.4         0.3  setosa     5.1
8           5.0         3.4          1.5         0.2  setosa     5.1
9           4.4         2.9          1.4         0.2  setosa     5.1
10          4.9         3.1          1.5         0.1  setosa     5.1

如果指标(COPY_IND)为是('Y'),我实际上想要在'New_Var'中复制变量'Sepal.Length'。

如果我执行以下操作,我会得到所需的回复:

if (COPY_IND=='Y')
{
  prac_data$New_Var <- prac_data$Sepal.Length

} else {prac_data$New_Var <- 'N'}

我只想了解为什么R对待'if-else'两种方法的方式不同?

还有另一种更优雅的方式吗?

提前致谢!!

2 个答案:

答案 0 :(得分:0)

实际上,这可能更容易作为答案阅读。

ifelse()帮助:“ifelse 返回一个与test 形状相同的值,该值填充了从yes或no中选择的元素,具体取决于test元素是TRUE还是FALSE”。

您的测试只是一个值,因此ifelse()会返回单个值,Sepal.Length[1]N,然后在整个列中重复。

您的路上需要rowwise()prac_data <- prac_data %>% rowwise() %>% mutate(New_Var = ifelse(COPY_IND=='Y', Sepal.Length, 'N'))

答案 1 :(得分:0)

    在您的情况下,
  1. COPY_IND 总是“Y”,然后代码可以简化为prac_data$New_Var = prac_data$Sepal.Length。即使您想逐行使用ifelse语句,最好按照帮助文档中的说明进行操作
      

    进一步注意,如果(测试)是,否则,当测试是一个简单的真/假结果时,即当长度(测试)== 1时,没有更高效,并且通常更倾向于ifelse(test,yes,no)

  2. 我想所需的COPY_IND应该是数据帧/向量的一列而不是一个固定值。在这种情况下,您的代码会生成正确的答案,例如保留前五个数字:

    library(dplyr)
    prac_data <- head(iris,10)
    prac_data$COPY_IND=c(rep('Y',5),rep('N',5))
    #COPY_IND=c(rep('Y',5),rep('N',5)) works too
    prac_data <- prac_data %>% mutate(New_Var=ifelse(COPY_IND=='Y', Sepal.Length, 'N'))    
    
  3. 生成正确的列。