我正在尝试根据指标的值在数据集中创建新变量。以下是相同的代码:
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'两种方法的方式不同?
还有另一种更优雅的方式吗?
提前致谢!!
答案 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)
COPY_IND
总是“Y”,然后代码可以简化为prac_data$New_Var = prac_data$Sepal.Length
。即使您想逐行使用ifelse
语句,最好按照帮助文档中的说明进行操作
进一步注意,如果(测试)是,否则,当测试是一个简单的真/假结果时,即当长度(测试)== 1时,没有更高效,并且通常更倾向于ifelse(test,yes,no)
我想所需的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'))
生成正确的列。