根据另一列选择不同列中的值到新列

时间:2017-09-20 07:30:00

标签: r

我有一个名为df的示例数据:

     Value1     Value2     Identifier
1   0.01544308 9.984557    high
2   0.02857169 9.971428    high
3   0.02767568 9.972324    low
4   0.03003700 9.969963    high
5   0.02779373 9.972206    low
6   0.02869768 9.971302    high

我现在想要创建一个具有组合值的新列,具体取决于标识符列的内容。 如果Identifier值为“high”,我想在新列中包含Value1,如果它为“low”,我想在新列中使用Value2。

我已尝试使用此代码:

> df$Score <-0 
> df$Score[df$Identifier == "high"] <- df$Value1
> df$Score[df$Identifier == "low"] <- df$Value2

这有点工作,但我收到此错误消息:

  

4:在df $ Score [df $ Identifier ==“high”]&lt; - df $ Value1:number of   要替换的项目不是更换长度的倍数   5:在df $ Score [df $ Identifier ==“low”]&lt; - df $ Value2:要到的项目数   替换不是替换长度的倍数

当我检查新列Score中的值时,它适用于Value1,但对于Value2不太适合。

我做错了什么?或者可能有一种完全不同的方法?任何帮助表示赞赏。感谢。

1 个答案:

答案 0 :(得分:1)

可重复的例子:

> df = data.frame(v1=runif(10), v2=runif(10)+100, id=sample(c("High","Low"),10,TRUE))
> df
          v1       v2   id
1  0.5369817 100.7348 High
2  0.4603543 100.2849  Low
3  0.7916333 100.3077 High
4  0.9786784 100.6317  Low
5  0.9116897 100.6764  Low
6  0.3311296 100.5460 High
7  0.4623154 100.5480  Low
8  0.5737816 100.1262 High
9  0.3905863 100.0561  Low
10 0.6010738 100.3528  Low

你想要的是ifelse

> df$Score = ifelse(df$id=="High",df$v1,df$v2)
> df
          v1       v2   id       Score
1  0.5369817 100.7348 High   0.5369817
2  0.4603543 100.2849  Low 100.2848737
3  0.7916333 100.3077 High   0.7916333
4  0.9786784 100.6317  Low 100.6316633
5  0.9116897 100.6764  Low 100.6763961
6  0.3311296 100.5460 High   0.3311296
7  0.4623154 100.5480  Low 100.5479902
8  0.5737816 100.1262 High   0.5737816
9  0.3905863 100.0561  Low 100.0561174
10 0.6010738 100.3528  Low 100.3527770