【问题标题】:Copy the value of a column from the previous row where conditions on other columns are met从满足其他列条件的上一行复制列的值
【发布时间】:2021-05-12 10:29:06
【问题描述】:

我有一个包含 3 列(V1、V2 和 V3)的数据框 (df)。我想添加一列(V4),我在其中输入(对于每一行)来自另一行的 V3 的值,其中 V1+0.5 的值等于第 i 行的 V1 并且其中 V2+0.5 的值等于第 i 行的 V2。

对于不满足这个条件的行,我要在V4的那一列有一个NA。

V1 <- c(-2.5,-2,-1.5,-1,-0.5,0,0.5,1,1.5,2,2.5,3,3.5)
V2 <- c(14,14.5,15,15.5,1,1.5,2,2.5,8,8.5,9,9.5,10)
V3 <- c(42,42.1,42.2,42.3,42.4,42.5,42.6,42.7,42.8,42.9,43,43.1,43.2)
df <- data.frame(V1,V2,V3)

对于这个输入数据:

 V1     V2     V3        
-2.5    14     42
-2      14.5   42.1
-1.5    15     42.2
-1      15.5   42.3
-0.5    1      42.4
 0      1.5    42.5
 0.5    2      42.6
 1      2.5    42.7
 1.5    8      42.8
 2      8.5    42.9 
 2.5    9      43
 3      9.5    43.1  
 3.5    10     43.2

我想要的结果是:

 V1     V2     V3     V4   
-2.5    14     42     NA
-2      14.5   42.1   42
-1.5    15     42.2   42.1
-1      15.5   42.3   42.2
-0.5    1      42.4   NA   
 0      1.5    42.5   42.4
 0.5    2      42.6   42.5
 1      2.5    42.7   42.6
 1.5    8      42.8   NA
 2      8.5    42.9   42.8
 2.5    9      43     42.9
 3      9.5    43.1   43
 3.5    10     43.2   43.1

我想我可以使用 for 循环和 ifelse 语句(使用 is.na 作为 NA 值),但我不知道如何使用看起来像 df$V1(of row i ) == df$V1+0.5(第 x 行)(与 V2 相同)。

【问题讨论】:

    标签: r dataframe for-loop conditional-statements


    【解决方案1】:

    另一个dplyr 解决方案是使用ifelse

    library(dplyr)
    
    df1 %>% 
      mutate(V4 = ifelse(V1 == lag(V1) + 0.5 &  V2 == lag(V2) + 0.5, lag(V3), NA))
    
    #>      V1   V2   V3   V4
    #> 1  -2.5 14.0 42.0   NA
    #> 2  -2.0 14.5 42.1 42.0
    #> 3  -1.5 15.0 42.2 42.1
    #> 4  -1.0 15.5 42.3 42.2
    #> 5  -0.5  1.0 42.4   NA
    #> 6   0.0  1.5 42.5 42.4
    #> 7   0.5  2.0 42.6 42.5
    #> 8   1.0  2.5 42.7 42.6
    #> 9   1.5  8.0 42.8   NA
    #> 10  2.0  8.5 42.9 42.8
    #> 11  2.5  9.0 43.0 42.9
    #> 12  3.0  9.5 43.1 43.0
    #> 13  3.5 10.0 43.2 43.1
    

    数据:

    df1 <- data.frame(V1 = c(-2.5,-2,-1.5,-1,-0.5,0,0.5,1,1.5,2,2.5,3,3.5),
                      V2 = c(14,14.5,15,15.5,1,1.5,2,2.5,8,8.5,9,9.5,10),
                      V3 = c(42,42.1,42.2,42.3,42.4,42.5,42.6,42.7,42.8,42.9,43,43.1,43.2))
    

    【讨论】:

    • 嘿,谢谢,但我担心这个不适合我。在我的示例数据框 (df) 中,条件确实适用于前一行,如果它适用的话。因此,我了解到您使用了lag()。但就我的数据而言,情况并非总是如此。我不需要编写lag(),而是需要一个引用满足条件的行(无论是哪一行)的代码。它可以向下 100 行,也可以向上 15 行......因此我说“看起来像 df$V1(of row i) == df$V1+0.5 (of row x)” .很抱歉造成混乱。
    • 您还将我的问题编辑为我没有提出的问题。所以现在我的帖子的问题(标题)不再正确了......我真的是想问“如何从另一列的值为当前行的+0.5的行中复制列的值? "
    • @maris 标题只是应该告诉我们问题的要点,所以 tgat 部分很好。但请随时编辑正文并添加更多解释。我将很快进行编辑,并尝试提供一个适用于您在第一条评论中描述的解决方案。干杯。
    • 感谢您的帮助。我找到了一个对我有用的解决方案,将您建议的 lag() 与arrange() 结合使用(在许多排列组合中)。我不会在这里发布它,因为它不是一个非常干净的解决方案,而且对于我的问题来说过于复杂......我稍后会删除该帖子。
    猜你喜欢
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 2023-01-25
    • 2018-12-13
    相关资源
    最近更新 更多