根据R中其他两个变量之间的数值差异创建新变量

时间:2019-12-12 17:49:24

标签: r

这是一个示例数据集。

structure(list(vector1 = c(1, 4, 4, 2, 1, 3, 2, 3, 4, 5, 3, 5, 
5, 1, 4, 2, 4, 5, 2, 5), vector2 = c(4, 2, 3, 5, 3, 5, 2, 2, 
3, 3, 4, 1, 4, 1, 2, 1, 2, 1, 1, 2)), class = "data.frame", row.names = c(NA, 
-20L))

基本上我想做的就是根据这些数字之间的差异创建一个新的变量“ Direction”。我想说些类似的话:

如果vector2 == vector1或vector2 == vector1 +/- 1比Direction =='NS'

如果vector2 vector1 + 1比Direction =='EW'

希望这是有道理的。谢谢!

2 个答案:

答案 0 :(得分:1)

您可以尝试

df <- structure(list(vector1 = c(1, 4, 4, 2, 1, 3, 2, 3, 4, 5, 3, 5, 
                       5, 1, 4, 2, 4, 5, 2, 5), vector2 = c(4, 2, 3, 5, 3, 5, 2, 2, 
                                                            3, 3, 4, 1, 4, 1, 2, 1, 2, 1, 1, 2)), class = "data.frame", row.names = c(NA, 
                                                                                                                                      -20L))


df$direction <- with(df,ifelse((vector2 == vector1) | (vector2 == (vector1 + 1)) | (vector2 == (vector1 - 1)), "NS", 
                   ifelse(vector2 < (vector1-1) | (vector2 > (vector1 + 1)),"EW", NA)))

答案 1 :(得分:1)

这是一个类似的解决方案(稍微简单一些):

数据:

df <- data.frame(
  vector1 = c(1, 4, 4, 2, 1, 3, 2, 3, 4, 5, 3, 5, 5, 1, 4, 2, 4, 5, 2, 5),
  vector2 = c(4, 2, 3, 5, 3, 5, 2, 2, 3, 3, 4, 1, 4, 1, 2, 1, 2, 1, 1, 2)
) 

所需的新列:

df$direction <- ifelse(df$vector1==vector2 | 
                         df$vector1==vector2 + 1 | 
                         df$vector1==vector2 - 1, "NS","EW")

结果:

df
   vector1 vector2 direction
1        1       4        EW
2        4       2        EW
3        4       3        NS
4        2       5        EW
5        1       3        EW
6        3       5        EW
7        2       2        NS
8        3       2        NS
9        4       3        NS
10       5       3        EW
11       3       4        NS
12       5       1        EW
13       5       4        NS
14       1       1        NS
15       4       2        EW
16       2       1        NS
17       4       2        EW
18       5       1        EW
19       2       1        NS
20       5       2        EW