【问题标题】:R - Test if value is the same as the one in the cell aboveR - 测试值是否与上面单元格中的值相同
【发布时间】:2017-11-23 09:39:29
【问题描述】:

我有以下df:

name   color
A      red 
B      red
C      green
D      red
E      red
F      red

我想测试“颜色”列中的值,看看它们是否与上面行中的值相同,然后写入新列...我可以使用以下方法:

> df$same <- ifelse(df$color == df$color[c(NA,1:(nrow(df)-1))], 1, 0)

给我:

name   color  same
A      red      NA
B      red       1
C      green     0
D      red       0
E      red       1
F      red       1

但是有没有更清洁的方法呢? (我一直用这个)...

【问题讨论】:

  • 可能不干净,但这里有一个替代方案:as.integer(c(NA, diff(as.integer(dat$color)) == 0))

标签: r if-statement dataframe dplyr na


【解决方案1】:

除了 Rafael 的回答,您可以使用 ifelsedplyr::mutate

> dt <- data_frame(name = c('A', 'B', 'C', 'D', 'E', 'F'), color = c('red', 'red', 'green', 'red', 'red', 'red'))
> dt
# A tibble: 6 x 2
   name color
  <chr> <chr>
1     A   red
2     B   red
3     C green
4     D   red
5     E   red
6     F   red
> dt %>% mutate(same = ifelse(color == lag(color), 1, 0))
# A tibble: 6 x 3
   name color  same
  <chr> <chr> <dbl>
1     A   red    NA
2     B   red     1
3     C green     0
4     D   red     0
5     E   red     1
6     F   red     1

【讨论】:

    【解决方案2】:

    您可以尝试dplyr 包中的lag 函数。您可以使用上面行的值创建一个新列,然后比较它们,

    > dt$color_above <- lag(dt$color, n=1)
    
    > dt   
    
      name color color_above
    1    A   red        <NA>
    2    B   red         red
    3    C green         red
    4    D   red       green
    5    E   red         red
    6    F   red         red
    

    或直接解决问题,您可以使用magrittr 包中的管道运算符。它仍然很冗长,但我认为它使代码更加清晰。

    > dt %$%  
        { color == lag(color, n=1) } %>% 
        as.numeric() %>% 
        {.} -> dt$same
    
    > dt
    
      name color same
    1    A   red   NA
    2    B   red    1
    3    C green    0
    4    D   red    0
    5    E   red    1
    6    F   red    1
    

    【讨论】:

      【解决方案3】:

      这在标准 R 中怎么样(可能更具可读性,但不会比你的短多少):

      colour <- c("red","red","green","red","red","red")
      (c(NA, colour) == c(colour, NA))[1:length(colour)]
      
      [1]    NA  TRUE FALSE FALSE  TRUE  TRUE
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-07-06
        • 2019-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多