R 如果值大于其上一个值,则使用ifelse语句计算

R 如果值大于其上一个值,则使用ifelse语句计算,r,R,我试图计算每个小组前一天的变化 假设我有这些观察结果: cat var1 var2 date 1 male 172 68 2011-01-01 2 female 61 141 2011-01-02 3 female 211 208 2011-01-03 4 other 10 95 2011-01-04 5 female 149 49 2011-01-05 如果当前var1大于或不大于使用ifelse语句得到的先前

我试图计算每个小组前一天的变化

假设我有这些观察结果:

       cat var1 var2       date
1     male  172   68 2011-01-01
2   female   61  141 2011-01-02
3   female  211  208 2011-01-03
4    other   10   95 2011-01-04
5   female  149   49 2011-01-05
如果当前var1大于或不大于使用ifelse语句得到的先前结果,我想添加一个0或1的新列

       cat var1 var2       date   NEWCOL
1     male  172   68 2011-01-01     -
2   female   61  141 2011-01-02     -
3   female  211  208 2011-01-03     1   # since its greater than 61
4   female   10   95 2011-01-04     0   # since its less than 211
5   female  149   49 2011-01-05     1   # since its greater than 10
数据:

试试这个:

var1向量:

df$var1
  [1] 212 103  43 193  29 153 164 115 136  91   9 130  72 116 102 113  28 167 210 132  14  72  82  53  13  91 201
 [28] 149 153  73  23  28   4 166 163 103   5   4 109 101  44  58  49  50  11 120   4  66  27 132  89 205 110   1
 [55] 139  73   9  34   6  29  73  47  51 105  45 101  16   3  19 212  60 144 208  53  56  35  65  31 158  83 195
 [82]  10  60  39  12 154 141 185  15 140  48   9  51  36 120 149 172 142  71  26 193  61   5 175 162 141  35 127
[109] 150 103 194 165 157 196 175  66 186 138  99 166 164 136 118  74  46  66  40  57 155 191 139 195  19 175  57
[136] 137 188  50 211  44 149  22  50  15 162 125  49 155 184 168  16 137 208 135 116 110 136 117 196  55  62  55
[163] 149  70  85  23 139 102 107 195 139  52 160 175 159   5 119  55 137 166 131 115  53 119  19  82  87  17 169
[190]  86 156 197 210  30  43 133  54 212  45  29 149 108  30 142  78  42   2  83 102  64  53 172 
它的差异向量。n-1项

diff(df$var1)
  [1] -109  -60  150 -164  124   11  -49   21  -45  -82  121  -58   44  -14   11  -85  139   43  -78 -118   58   10
 [23]  -29  -40   78  110  -52    4  -80  -50    5  -24  162   -3  -60  -98   -1  105   -8  -57   14   -9    1  -39
 [45]  109 -116   62  -39  105  -43  116  -95 -109  138  -66  -64   25  -28   23   44  -26    4   54  -60   56  -85
 [67]  -13   16  193 -152   84   64 -155    3  -21   30  -34  127  -75  112 -185   50  -21  -27  142  -13   44 -170
 [89]  125  -92  -39   42  -15   84   29   23  -30  -71  -45  167 -132  -56  170  -13  -21 -106   92   23  -47   91
[111]  -29   -8   39  -21 -109  120  -48  -39   67   -2  -28  -18  -44  -28   20  -26   17   98   36  -52   56 -176
[133]  156 -118   80   51 -138  161 -167  105 -127   28  -35  147  -37  -76  106   29  -16 -152  121   71  -73  -19
[155]   -6   26  -19   79 -141    7   -7   94  -79   15  -62  116  -37    5   88  -56  -87  108   15  -16 -154  114
[177]  -64   82   29  -35  -16  -62   66 -100   63    5  -70  152  -83   70   41   13 -180   13   90  -79  158 -167
[199]  -16  120  -41  -78  112  -64  -36  -40   81   19  -38  -11  119  
现在你可以问:

diff(df$var1)>0
[1] FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE
 [19] FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE
 [37] FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE
 [55] FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE
 [73] FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE
 [91] FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE
[109] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
[127]  TRUE  TRUE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE
[145] FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE
[163] FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE
[181] FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE
[199] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE
由于F=0和T=1,只需使用数字版本并添加前导NA:

df$change <- c(NA,as.numeric(diff(df$var1)>0))
事实上你不需要其他的。。。。但你也可以做到:

df$change2 <- c(NA,ifelse(test = diff(df$var1)>0,yes = 1,no = 0))
试试这个:

var1向量:

df$var1
  [1] 212 103  43 193  29 153 164 115 136  91   9 130  72 116 102 113  28 167 210 132  14  72  82  53  13  91 201
 [28] 149 153  73  23  28   4 166 163 103   5   4 109 101  44  58  49  50  11 120   4  66  27 132  89 205 110   1
 [55] 139  73   9  34   6  29  73  47  51 105  45 101  16   3  19 212  60 144 208  53  56  35  65  31 158  83 195
 [82]  10  60  39  12 154 141 185  15 140  48   9  51  36 120 149 172 142  71  26 193  61   5 175 162 141  35 127
[109] 150 103 194 165 157 196 175  66 186 138  99 166 164 136 118  74  46  66  40  57 155 191 139 195  19 175  57
[136] 137 188  50 211  44 149  22  50  15 162 125  49 155 184 168  16 137 208 135 116 110 136 117 196  55  62  55
[163] 149  70  85  23 139 102 107 195 139  52 160 175 159   5 119  55 137 166 131 115  53 119  19  82  87  17 169
[190]  86 156 197 210  30  43 133  54 212  45  29 149 108  30 142  78  42   2  83 102  64  53 172 
它的差异向量。n-1项

diff(df$var1)
  [1] -109  -60  150 -164  124   11  -49   21  -45  -82  121  -58   44  -14   11  -85  139   43  -78 -118   58   10
 [23]  -29  -40   78  110  -52    4  -80  -50    5  -24  162   -3  -60  -98   -1  105   -8  -57   14   -9    1  -39
 [45]  109 -116   62  -39  105  -43  116  -95 -109  138  -66  -64   25  -28   23   44  -26    4   54  -60   56  -85
 [67]  -13   16  193 -152   84   64 -155    3  -21   30  -34  127  -75  112 -185   50  -21  -27  142  -13   44 -170
 [89]  125  -92  -39   42  -15   84   29   23  -30  -71  -45  167 -132  -56  170  -13  -21 -106   92   23  -47   91
[111]  -29   -8   39  -21 -109  120  -48  -39   67   -2  -28  -18  -44  -28   20  -26   17   98   36  -52   56 -176
[133]  156 -118   80   51 -138  161 -167  105 -127   28  -35  147  -37  -76  106   29  -16 -152  121   71  -73  -19
[155]   -6   26  -19   79 -141    7   -7   94  -79   15  -62  116  -37    5   88  -56  -87  108   15  -16 -154  114
[177]  -64   82   29  -35  -16  -62   66 -100   63    5  -70  152  -83   70   41   13 -180   13   90  -79  158 -167
[199]  -16  120  -41  -78  112  -64  -36  -40   81   19  -38  -11  119  
现在你可以问:

diff(df$var1)>0
[1] FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE
 [19] FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE
 [37] FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE
 [55] FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE
 [73] FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE
 [91] FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE
[109] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
[127]  TRUE  TRUE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE
[145] FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE
[163] FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE
[181] FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE
[199] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE
由于F=0和T=1,只需使用数字版本并添加前导NA:

df$change <- c(NA,as.numeric(diff(df$var1)>0))
事实上你不需要其他的。。。。但你也可以做到:

df$change2 <- c(NA,ifelse(test = diff(df$var1)>0,yes = 1,no = 0))

如果我理解正确,您可以对数据进行排序,然后使用lag


如果我理解正确,您可以对数据进行排序,然后使用lag


我喜欢基本答案,但有一个简短的演示可能会更有帮助。i、 e.,set.123;x 0L此外,您可能希望解决OP想要的分组问题:avedf$var1,df$cat,FUN=functionx cNA,diffx>0同意。事实上,我曾考虑过采用比OPs更短的向量,但出于某种原因,我的决定有所不同……我喜欢基本答案,但有一个简短的演示可能会更有帮助。i、 e.,set.123;x 0L此外,您可能希望解决OP想要的分组问题:avedf$var1,df$cat,FUN=functionx cNA,diffx>0同意。事实上,我想用一个比OPs短的向量,但由于某种原因,我的决定不同。。。